2017-09-15 7 views
1

J'ai 2 entités:PersistenceException tout en essayant de cascade persisteront entité enfant

Master:

@Entity 
@Table(name = "master") 
public class Master implements java.io.Serializable { 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "seq") 
    private Integer seq; 

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinColumn(name = "seq", referencedColumnName = "seq") 
    private SubMaster subMaster; 


    ................... 

} 

Sous Maître:

@Entity 
@Table(name = "sub_master") 
public class SubMaster implements java.io.Serializable { 

    @Id 
    @Column(name = "seq") 
    private Integer seq; 

    private String subName; 


    ................... 

} 

Quand, je suis en train de persister Master entité en définissant l'entité SubMaster, je suis suivi exception Par contre, je m'attends à ce que Hibernate conserve automatiquement l'entité enfant à chaque fois que l'entité parente est conservée.

Répondre

2

tout d'abord vous inversé le propriétaire de l'association que je crois que submaster devrait avoir l'annotation @JoinColumn .

maintenant la solution

dépend de la version JPA:

-2,0 vous pouvez définir l'annotation @Id sur l'annotation de relation de sorte que vous pourriez avoir quelque chose comme

@Entity 
@Table(name = "master") 
public class Master implements java.io.Serializable { 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "seq") 
    private Integer seq; 

    @OneToOne(mappedBy = "master", cascade = CascadeType.ALL) 
    private SubMaster subMaster; 

} 

@Entity 
@Table(name = "sub_master") 
public class SubMaster implements java.io.Serializable { 

    @Id 
    @JoinColumn(name = "seq", referencedColumnName = "seq") 
    @OneToOne 
    private Master master; 

    private String subName; 

} 

où vous dites à votre entité enfant prendre l'identifiant du parent

master.setSubMaster(subMaster); 
subMaster.setMaster(master) 

-1.0 vous êtes à peu près coincé comme vous êtes obligé de placer @Id sur une annotation de base, donc vous devez avoir un id et une colonne de relation séparés, le problème est qu'avec @GeneratedValue vous êtes obligé d'enregistrer d'abord le parent, puis manuellement l'id de l'enfant avant d'enregistrer

ref: https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_and_ManyToOne_Relationships

2

ajouter @GeneratedValue (stratégie = identité) pour submaster bien, semble que c'est l'id submaster qui a généré l'exception

+0

mais, je crois id submaster devrait être le même que master. Cependant, si j'utilise ceci, je reçois une exception (ce que je pense est évident): 'java.sql.SQLException: Le champ 'seq' n'a pas de valeur par défaut' – gschambial

+0

Quel serait le point d'avoir le même identifiant pour tous les deux ? OneToOne va générer une référence de clé étrangère. Si vous souhaitez également joindre l'ID maître, vous devez spécifier une deuxième colonne à joindre et ajouter un attribut id_master dans votre classe sub_master. En outre, vous pouvez désactiver l'entrée null pour l'élément seq à cause de la jointure (il pourrait s'agir de la source de l'exception) – alexay68