我有两个@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.
请帮我.
解决方法
在这里,您已在B类上面的private A a;中指定了mappedBy.在双向关系中,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();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。