JPA @OneToMany -> Parent - Enfant de Référence (Clé Étrangère)
j'ai une Question sur le référencement ParentEntities de l'Enfant Entités ir
Si j'ai quelque chose comme ceci:
Parent.java:
@Entity(name ="Parent")
public class Parent {
@Id
@Generate.....
@Column
private int id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "parent")
private Set<Child> children;
simple ... getter and setter ...
}
Et la Child.java:
@Entity(name ="Child")
public class Child{
@Id
@Generate....
@Column
private int id;
@ManyToOne
private Parent parent;
... simple getter an setter
}
Tableaux suivants vont être créées:
Parent:
int id
Child:
int id
int parent_id (foreign key: parent.id)
Ok, pour l'instant, everthings amende. Mais quand il vient à l'aide de cette Référence de Java, je pense que vous pouvez faire quelque chose comme cela.
@Transactional
public void test() {
Parent parent = new Parent();
Child child = new Child();
Set<Child> children = new HashSet<Child>();
children.add(child);
parent.setChildren(children);
entityManager.persist(parent);
}
ce qui conduit à cette Base de données:
Parent:
id
100
Child
id paren_id
101 100
Mais ce n'est pas le cas, vous devez définir explicitement la Mère à l'Enfant (ce qui, je pense, le cadre pourrait probablement faire par lui-même).
Donc ce qui est vraiment dans la base de données est: est-ce
Parent:
id
100
Child
id paren_id
101 (null)
parce que je n'ai pas le Parent de l'Enfant. Donc ma Question:
Dois-je vraiment faire qqch. comme cette?
Parent.java:
...
setChildren(Set<Child> children) {
for (Child child : children) {
child.setParent.(this);
}
this.children = children;
}
...
Edit:
Selon les Réponses rapides, j'ai pu résoudre ce Problème en utilisant les annotations @JoinColumn sur la Référence-Entité Propriétaire. Si nous prenons l'Exemple ci-dessus, j'ai fait qqch. comme ceci:
Parent.java:
@Entity(name ="Parent")
public class Parent {
@Id
@Generate.....
@Column
private int id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name= "paren_id")
private Set<Child> children;
simple ... getter and setter ...
}
Et la Child.java:
@Entity(name ="Child")
public class Child{
@Id
@Generate....
@Column
private int id;
... simple getter an setter
}
Maintenant, si nous faisons cela:
@Transactional
public void test() {
Parent parent = new Parent();
Child child = new Child();
Set<Child> children = new HashSet<Child>();
children.add(child);
parent.setChildren(children);
entityManager.persist(parent);
}
La Référence est correctement réglée par le Parent:
Parent:
id
100
Child
id paren_id
101 100
Merci pour les Réponses.
- avez-vous parent de l'enfant entité? si oui, comment ils sont configurés. Avec aucun parent j'obtiens l'erreur(StaleStateException: mise à jour par Lot retourné inattendue du nombre de lignes de mise à jour [0]; un nombre de lignes: 0; attendu: 1). Si j'ai ajouter un parent sans annotations, il affiche erreur(erreur de Cartographie). Avec le paramètre @manytoone sur le champ parent de l'enfant, j'obtiens le message d'erreur sur save( ORA-00904: "REPORT_REPORT_ID": недопустимый идентификатор). mon fk et son pk id nommé report_id mais je ne sais pas d'où vient report_report_id.
- (À l'aide d'EclipseLink implémentation JPA). Il est intéressant de noter que vous avez toujours besoin de l' @Column(name="paren_id")private long parenId; la cartographie de votre enfant pour cette wot travail.
Vous devez vous connecter pour publier un commentaire.
C'est une stratégie, oui.
Sur la bi-directionnelle relations il y a un "propriétaire" et un "non-propriétaire" du côté de la relation. Parce que le propriétaire de côté dans votre cas est sur
Child
, vous devez définir la relation pour être conservé. Le propriétaire de côté est généralement déterminée par l'endroit où vous spécifiez@JoinColumn
, mais il ne semble pas que vous utilisez cette annotation, il est donc susceptible d'être déduit du fait que vous avez utilisémappedBy
dans leParent
annotation.Vous pouvez lire beaucoup plus à ce sujet ici.
Il semble toujours être le cas. Dans le parent
Entity
vous pouvez avoir quelque chose commeafin d'éviter de répéter le code pour le réglage de l'enfant/relation parent ailleurs dans le code.
Oui, c'est le cas. JPA ne pas conserver les soins au sujet de la cohérence de votre entité graphique. Surtout que vous avez à régler au propriétaire du côté de la relation bidirectionnelle (dans votre cas à l'attribut parent de l'Enfant).
En JPA 2.0 spécification de ce qui est dit avec les mots suivants:
Nous avons rencontré un problème lors de la persistance d'un simple objet graphique comme celui illustré ci-dessus. Cours d'exécution dans H2 tout fonctionne, mais quand nous avons couru à l'encontre de MySQL le "paren_id" dans la table enfant (définis dans les annotations @JoinColumn annotation) n'était pas remplie avec l'identifiant généré de la société mère - même si elle a été définie comme une valeur non nulle de la colonne avec une contrainte de clé étrangère dans la DB.
Nous aurions une exception comme ceci:
Pour quelqu'un d'autre qui pourrait de cette, ce que nous avons finalement constaté qu'il nous fallait un autre attribut à la
@JoinColumn
pour le faire fonctionner:nullable = false
également résolu mes problèmes avec OneToMany. Pour ma OneToOne cependant mettre ce que j'ai toujours l'exception . Tous les conseils pour savoir comment gérer ce cas?Si je suis correctement, selon
EntityManager
, si vous le souhaitez pour gérer l'opération d'insertion de l'ordre de votre avoir de "lui dire" qu'il doit persister les enfants aussi. Et vous n'êtes pas faire ça, donc "il" ne sait pas ce que de persister, mais votre mère de l'enfant, la liste n'est pas vide si "il" s'il est correct, mais la valeur est null.De sorte que vous devriez envisager de faire quelque chose comme:
faire ce que vous voulez avec le parent de l'objet ici, alors s'engager et cela devrait fonctionner pour des cas semblables aussi.