Ja, das ist möglich. Dies ist ein Spezialfall der standardmäßigen bidirektionalen Beziehung @ManyToOne
/@OneToMany
. Es ist besonders, weil die Entität an jedem Ende der Beziehung die gleiche ist. Der allgemeine Fall ist in Abschnitt 2.10.2 der JPA 2.0 spec beschrieben.
Hier ist ein funktionierendes Beispiel. Zunächst wird die Entitätsklasse A
:
@Entity
public class A implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@ManyToOne
private A parent;
@OneToMany(mappedBy="parent")
private Collection<A> children;
// Getters, Setters, serialVersionUID, etc...
}
Hier eine grobe main()
Methode ist, dass drei solcher Einheiten bestehen:
public static void main(String[] args) {
EntityManager em = ... // from EntityManagerFactory, injection, etc.
em.getTransaction().begin();
A parent = new A();
A son = new A();
A daughter = new A();
son.setParent(parent);
daughter.setParent(parent);
parent.setChildren(Arrays.asList(son, daughter));
em.persist(parent);
em.persist(son);
em.persist(daughter);
em.getTransaction().commit();
}
In diesem Fall werden alle drei Entitätsinstanzen müssen beibehalten werden vor der Transaktion zu begehen. Wenn es mir nicht gelingt, eine der Entitäten im Diagramm der Parent-Child-Beziehungen beizubehalten, wird eine Ausnahme auf commit()
ausgelöst. Auf Eclipselink ist dies ein RollbackException
, der die Inkonsistenz beschreibt.
Dieses Verhalten kann über das cascade
-Attribut unter A
@OneToMany
und @ManyToOne
Annotationen konfiguriert werden. Zum Beispiel, wenn ich cascade=CascadeType.ALL
auf diese beiden Anmerkungen setze, könnte ich sicher eine der Entitäten beibehalten und die anderen ignorieren. Angenommen, ich habe in meiner Transaktion parent
beibehalten. Die JPA-Implementierung durchläuft die Eigenschaft parent
children
, weil sie mit CascadeType.ALL
markiert ist. Die JPA-Implementierung findet son
und daughter
dort. Es beharrt dann beide Kinder in meinem Namen, obwohl ich es nicht ausdrücklich angefordert habe.
Noch ein Hinweis. Es liegt in der Verantwortung des Programmierers, beide Seiten einer bidirektionalen Beziehung zu aktualisieren. Mit anderen Worten: Wenn ich einem Elternteil ein Kind hinzufüge, muss ich die Elterneigenschaft des Kindes entsprechend aktualisieren. Das Aktualisieren nur einer Seite einer bidirektionalen Beziehung ist ein Fehler unter JPA. Aktualisieren Sie immer beide Seiten der Beziehung. Diese schriftlichen eindeutig auf Seite 42 der JPA 2.0-Spezifikation:
Beachten Sie, dass es die Anwendung ist, die Verantwortung für die Aufrechterhaltung der Konsistenz der Laufzeitbeziehungen, zum Beispiel trägt, um sicherzustellen, daß die „Eins“ und die „n "Seiten einer bidirektionalen Beziehung sind konsistent, wenn die Anwendung die -Beziehung zur Laufzeit aktualisiert.
Vielen Dank für die detaillierte Erklärung!Das Beispiel ist auf den Punkt und arbeitete im ersten Lauf. – sanjayav
@sunnyj Froh zu helfen. Viel Glück mit Ihrem (Ihren) Projekt (en). –
Dieses Problem wurde bereits beim Erstellen von Kategorieentitäten mit Unterkategorien behoben. Es ist hilfreich! –