JPA OneToOne双向.

Ye *_*too 7 java jpa jpa-2.0

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

}
Run Code Online (Sandbox Code Playgroud)

我的问题是"我可以在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();
Run Code Online (Sandbox Code Playgroud)

当我这样尝试时,表A(B_ID)中的foreign_key字段保存为null.
请帮我.

Pri*_*shi 13

在这里,您已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();
Run Code Online (Sandbox Code Playgroud)

要么

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();
Run Code Online (Sandbox Code Playgroud)

  • 您使用了哪种方法? (2认同)
  • 单向意味着您只有一种关系,并且该关系控制外键.Bidirectional有一个单向组件 - 一个控制数据库中外键的关系,以及另一个方向的只读后向指针.标记为mappedby的关系实际上是只读的,因为它使用在另一个实体上设置的关系,但是对此关系的更改不会更改数据库.JPA要求您维护双向关系的两个方面,以使缓存的实体与数据库保持同步 (2认同)