2013-07-07 5 views
2

Je les classes suivantes:OneToMany avec Unidirectionnel clé étrangère n'insère pas à la table

@Entity 
@Table(name = "PARENT") 
public class Parent { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "PARENT_ID", unique = true, nullable = false, insertable = true, updatable = true) 
private Long parentId; 


@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER) 
@JoinColumn(name="PARENT_ID", nullable = false) 
private List<Child> children; 


public Parent(List<Child> children) { 
this.children = children; 
} 


.. 
... Getters\Setters 

} 


@Entity 
@Table(name = "CHILD") 
public class Child { 

@Id 
@Column(name = "TYPE", unique = false, nullable = false) 
private String type; 

@Column(name = "RANK", unique = false, nullable = false, insertable = true, updatable = false) 
private String rank; 

} 

Le « PARENT_ID » est clé étrangère dans le tableau « enfant ». donc il fait table "CHILD" ayant 2 colonnes formant son PRIMARY_KEY.

-je effectuer l'insertion suivante:

List<Child> children = new LinkedList<Child>(); 
children.add(new Child("1,2,3,4")); 
children.add(new Child("1,2,3,4")); 

Parent parent = new Parent(children); 

session.save(parent); 

Si les deux tables sont vides, il crée les entrées « parent » et « enfants » correctement en attribuant PARENT_ID !, MAIS si « enfant » sont existent déjà dans table il effectue la mise à jour au lieu de l'insérer! ATTENTION: les deux 'enfant' ont le même "TYPE" ("1,2,3,4"), mais ils doivent avoir un "PARENT_ID" différent.

Qu'est-ce qui me manque ici?

Merci!

Répondre

0

Dans votre enfant, vous devez avoir une instance du parent et je crois que vous avez égaré le JoinColumn dans votre classe Parent qui devrait être dans votre classe enfant. Et le constructeur n'est pas requis dans votre classe Parent.

classe parent devrait ressembler à:

@Entity 
@Table(name = "PARENT") 
public class Parent { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "PARENT_ID", unique = true, nullable = false, insertable = true,   updatable = true) 
private Long parentId; 


@Embedded 
private Child children; 


.. 
... Getters\Setters (MAke sure you have the getter setter for children as well) 

} 

Votre classe enfant doit être quelque chose comme:

@Embeddable 
@Table(name = "CHILD") 
public class Child { 

@Id 
@Column(name = "TYPE", unique = false, nullable = false) 
private String type; 

@Column(name = "RANK", unique = false, nullable = false, insertable = true, updatable = false) 
private String rank; 


    //getter and setters 
+0

ouais, cela pourrait fonctionner, mais maintenant une association bidirectionnelle qui est agréable, mais ajoute non nécessaire complexité au code. – Shvalb

+0

Oui, vous pouvez avoir raison, Embedded et Embeddable pourrait être une meilleure approche. Cependant, le contexte dans lequel vous utiliserez ceci sera plus important – amitsalyan

Questions connexes