java - JPA OneToOne 双向。

标签 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

}

我的问题是“我可以在 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。在双向关系中,mappedBy 表示我不是所有者。所以这意味着A是关系的所有者。

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

尝试以下:

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

关于java - JPA OneToOne 双向。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14746318/

相关文章:

java - 不存在的错误

java - PDFBox:AAAAAD+FreeSerifBold 字体中没有 U+0054 的字形

java - Spring Data JPA连接2个表

hibernate - 使用 Hibernate 3.6.3 和 JPA 2.0 创建类型化查询时出现 AbstractMethodError

jpa 字符串值列表的不区分大小写的子句

java - 在 JPA 2.0 中从没有外键的多个表中获取数据

javascript - Android 上的 JQuery ajax 调用

java - 不理解嵌套类型

java - Spring JPA/hibernate : Failed to import bean definitions

java - JPA 标准 API : how to dump a human-readable representation for Predicates