Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA OneTONE双向。_Java_Jpa_Jpa 2.0 - Fatal编程技术网

Java JPA OneTONE双向。

Java JPA OneTONE双向。,java,jpa,jpa-2.0,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

我有两个实体类,它们是@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)方法吗?我的意思是这样的

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。

请帮帮我。

在这里,您在上面的B类
私有A A;
中指定了
mappedBy
。在双向关系中,
mappedBy
表示我不是关系的所有者。因此,它表示A是关系的所有者

在A表中,B表将有一个foreignkey。由于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();

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


那么,fri,@OneToOne关系中单向和双向的区别是什么?谢谢你的回答!单向意味着你只有一个单向的关系,而这个关系控制着外键。双向有一个单向组件-一个控制da中外键的关系tabase和一个只读的反向指针。标记为mappedby的关系实际上是只读的,因为它使用在另一个实体上设置的关系,但对该关系的更改不会更改数据库。JPA要求您维护双向关系的两侧,以使缓存的实体保持同步和database@PriyankDoshi你能解释一下为什么不是这样吗?
public class B {
@Id
private int id;
private String name;
@OneToOne(mappedBy="b")
 @Cascade({CascadeType.SAVE_UPDATE}) 
    private A a;
//setter and getters

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