JPA OneToOne双向。

我有两个@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。
请帮帮我。

在这里,你已经在private A a;上面的B类中指定了mappedBy 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(); 

使用@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 } 

你需要在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();