我有两个@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)中的foreign_key字段保存为null 请帮帮我。
答案 0 :(得分:12)
在此,您已在mappedBy
上方的B类中指定了private 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();
答案 1 :(得分: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
}
答案 2 :(得分: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();