JPA mise en veille prolongée et l'héritage TABLE_PER_CLASS

voix
0

J'ai une entité qui est super classe

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = super_class)
public abstract class SuperClass implements Serializable {
    @Transient
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private long id;

    public abstract void initDefaultValues();

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

}

et certaines sous-classes qui étendent la superclasse.

@Entity
@Table(name = Subclass1)
public class Subclass1 extends SuperClass{

    private static final Logger log = LogManager
            .getLogger(Subclass1.class);
    @Transient
    private static final long serialVersionUID = 1L;

    // testcase configuration tab
    private String configurationTabTestServer;


    private String umtsRelease;


}

Les autres classes ont le même aspect.

Je les avoir SINGLE_TABLE pour le type d'héritage, mais nous voulions chaque classe concrète d'avoir chaque table. En raison de TABLE_PER_CLASS je devais utiliser GenerationType.TABLE.

J'ai aussi une classe d'entité qui a une clé étrangère à la super classe

@Entity
@Table(name=myother_entity)
class Entity1{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @OneToOne(cascade = CascadeType.ALL)
    private SuperClass superclass;
    //more fields
}

J'ai utilisé une classe abstraite parce que j'ai une classe Entité1 qui pourrait avoir différents types de superclasse. Nous ne voulions pas créer différents Entité1 et Entité2 et Entity3 etc classes pour chaque sous-classe. Nous avons donc créé une classe Entité1 qui peut avoir un champ de type superclasse, qui pourrait pointer vers l'une des sous-classes.

Sur mon programme, je crée beaucoup entity1 intances que certains d'entre eux qui ont différents types de superclasse comme valeur du champ. Chacun pouvait être de type subclass1 ou subclass2 etc. Au début, nous avions une table unique pour toutes les sous-classes. Tout fonctionnait bien. Mais après nous avons décidé de partager nos tables c'est ce qu'il se passe. à quand je modifier une instance Entité1, qui a déjà mis sur le terrain SuperClass (en utilisant l'une des sous-classes), et enregistrez-le (fusionner), il crée une nouvelle instance de mon sous-classe associée à mon exemple Entité1, et enregistre la base de données. J'ai donc deux dossiers sur la table de la sous-classe. Cela ne se produit pas lorsque nous avons utilisé un type d'héritage SINGLE_TABLE. Est-ce normal pour JPA et mise en veille prolongée?

Créé 03/08/2015 à 15:29
utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

S'il vous plaît, tout d'abord considérer ceci: annotations DiscriminatorColumn et DiscriminatorValue sont spécifiques à l'approche table unique. Donc, ils ne doivent pas être utilisés dans les applications de table par classe.

Maintenant, nous allons aller à la question:

Dans la cartographie table par classe, il y aura deux dossiers avec la même ID: un dans une table parent, d'autres dans une table enfant.

Comme je l'ai compris, dans votre cas, deux dossiers sont en cours d'écriture dans la table des enfants, non? Dans ce cas, le problème doit être lorsque vous chargez les données entity1 de la base de données. La propriété « superclasse » doit avoir son ensemble ID. Vous pouvez utiliser le chargement désireux ou paresseux pour cela. Et vérifier si cette propriété est correctement chargé (en mode débogage) avec son bon jeu d'identification avant de l'enregistrer.

Une autre façon est de désactiver « cascade persisteront / fusion » et pour enregistrer les entités séparément. Il peut fournir plus de sécurité à vos données.

Vous trouverez plus d' informations ici: http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

Créé 03/08/2015 à 16:01
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more