JPA双向一对一关系

6
我有两个实体类,它们之间存在@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

}

我的问题是“我能在类B中使用setA(A a)方法吗?我的意思是像这样…”
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)保存为null。
请帮助我。
4个回答

12
在类B中,你已经指定了mappedByprivate A a;的上方。在双向关系中,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();

那么,朋友,@OneToOne关系中的单向和双向有什么区别呢?谢谢你的回答! - Ye Kyaw Kyaw Htoo
2
单向的意思是你只有一个方向的关系,并且该关系控制着外键。双向具有单向组件-一种控制数据库中外键的关系,以及在另一侧上具有只读的反向指针。标记为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

}

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

0

我也遇到了同样的问题。一个类已经有了类B的Setter方法。我的问题是在类B中使用Setter解决了。在类B中,我像这样放置了Setter方法。

public void setA(A a){ 
this.a=a;
a.setB(this);
} 

.


0

在 em.persist(bb) 之前,你需要添加 aa.setB(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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接