2013-02-07 18 views
6

Ich habe zwei Entity-Klassen, die in @ OneToOne Beziehung sind. Der Beispielcode sind wie folgt:JPA OneToOne bidirektional.

public class A { 
@Id 
private int id; 
private String name; 
@JoinColumn(name = "B_ID", referencedColumnName = "id") 
@OneToOne(cascade=CascadeType.ALL) 
private B b; 

//setters and getters 

} 

public class B { 
@Id 
private int id; 
private String name; 
@OneToOne(mappedBy="b") 
    private A a; 
//setter and getters 

} 

meine Frage ist, „Kann ich setA (A a) Methode in der Klasse B. ich so meine

em.getTransaction().begin(); 
A aa = new A(); 
aa.setId(1); 
aa.setName("JJ"); 
em.persist(aa); 

B bb = new B(); 
bb.setId(1); 
bb.setName("CC"); 
bb.setA(aa); 
em.persist(bb); 
em.getTransaction().commit(); 

Wenn ich so versucht.. , das foreign_key Feld in Tabelle A (B_ID) wurde als null gespeichert.
Bitte helfen Sie mir.

Antwort

11

Hier legen Sie mappedBy in der Klasse B oben private A a; angegeben haben. in einem bidirektionalen Beziehung, mappedBy bedeutet, dass ich nicht der Besitzer bin. Es bedeutet also, dass A der Besitzer der Beziehung ist.

In der Tabelle von A haben Sie einen Fremdschlüssel für die Tabelle B. Da A der Eigentümer ist, soll A Operationen zu B kaskadieren. Im Idealfall sollten Sie versuchen a.setB() und dann a.

Versuchen Sie unter:

em.getTransaction().begin(); 
//first create B. 
B bb = new B(); 
bb.setId(1); 
bb.setName("CC"); 
em.persist(bb); 

//create A with B set in it. 
A aa = new A(); 
aa.setId(1); 
aa.setName("JJ"); 
aa.setB(bb); 
em.persist(aa); 
em.getTransaction().commit(); 

Oder

em.getTransaction().begin(); 
//first create B. 
B bb = new B(); 
bb.setId(1); 
bb.setName("CC"); 
// no need to persist bb. 

//create A with B set in it. 
A aa = new A(); 
aa.setId(1); 
aa.setName("JJ"); 
aa.setB(bb); 
em.persist(aa); // because of cascade all , when you persist A , 
// B will also be persisted. 
em.getTransaction().commit(); 
+0

welchen Ansatz Sie verwendet? –

+0

dann fri, was wären die Unterschiede zwischen unidirektionalen und bidirektionalen in @ OneToOne Beziehung ..? Danke für deine Antwort! –

+1

Unidirektional bedeutet, dass Sie nur eine Beziehung haben, die in eine Richtung geht, und diese Beziehung steuert den Fremdschlüssel. Bidirektional hat eine unidirektionale Komponente - eine Beziehung, die den Fremdschlüssel in der Datenbank steuert, und einen schreibgeschützten Zurückzeiger, der in die andere Richtung geht. Die Beziehung, die mit mappedby gekennzeichnet ist, ist effektiv nur lesbar, da sie die Beziehung verwendet, die für die andere Entität festgelegt wurde, aber Änderungen an dieser Beziehung ändern die Datenbank nicht. JPA erfordert, dass Sie beide Seiten einer bidirektionalen Beziehung verwalten, um die zwischengespeicherten Entitäten mit der Datenbank synchron zu halten. – Chris

1

Verwenden @Cascade ({CascadeType.SAVE_UPDATE}) zu Kaskade ändert

public class B { 
@Id 
private int id; 
private String name; 
@OneToOne(mappedBy="b") 
@Cascade({CascadeType.SAVE_UPDATE}) 
    private A a; 
//setter and getters 

} 
+0

Es ist nicht JPA-spezifisch. –

+0

@PriyankDoshi können Sie erläutern, warum es nicht ist? – meliniak

0

Sie aa.setB hinzufügen müssen (bb) vor em.persist (bb)

em.getTransaction().begin(); 
A aa = new A(); 
aa.setId(1); 
aa.setName("JJ"); 
em.persist(aa); 

B bb = new B(); 
bb.setId(1); 
bb.setName("CC"); 

aa.setB(bb);//this line should be added 
bb.setA(aa); 

em.persist(bb); 
em.getTransaction().commit(); 
Verwandte Themen