2013-02-07 67 views
6

我有两个@OneToOne关系的实体类。示例代码如下:JPA OneToOne双向。

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 

} 

这里我的问题是:“我可以用组A(A一)在B类的方法我的意思是这样

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(); 

当我试图这样。在表A(B_ID)的foreign_key场在这里保存为空。
请帮帮我。

回答

11

,已在B类以上private A a;指定mappedBy。在双向的关系,mappedBy意味着我不是所有者。所以这意味着A是关系的所有者。

在A的表中,您将拥有一个B表的外键。由于A是所有者,因此A假设级联操作为B.理想情况下,您应该尝试a.setB(),然后保留a。

如下尝试:

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(); 

或者

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

您使用哪种方法? –

+0

然后星期五,@OneToOne关系中单向和双向的区别是什么?感谢您的回答! –

+1

单向意味着你只有一种关系,并且该关系控制着外键。双向有一个单向组件 - 一种控制数据库中外键的关系,以及一种只读返回指针。标记为mappedby的关系只能有效地读取,因为它使用在另一个实体上设置的关系,但对这种关系的更改不会更改数据库。 JPA要求您维护双向关系的双方以保持缓存实体与数据库不一致 – Chris

1

使用@Cascade({} CascadeType.SAVE_UPDATE)级联改变

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

} 
+0

它不是JPA特有的。 –

+0

@PriyankDoshi你能详细说明它为什么不是吗? – meliniak

0

你需要添加aa.setB( bb)before 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();