Java 在Hibernate中保存实体后更新OneToMany列表
我有关系:Java 在Hibernate中保存实体后更新OneToMany列表,java,hibernate,orm,Java,Hibernate,Orm,我有关系: // In A.java class @OneToMany(mappedBy="a", fetch=FetchType.LAZY) @Cascade(CascadeType.SAVE_UPDATE) private List<B> bList; // In B.java class @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="id_a") @Cascade(CascadeType.SAVE_UPDATE) pri
// In A.java class
@OneToMany(mappedBy="a", fetch=FetchType.LAZY)
@Cascade(CascadeType.SAVE_UPDATE)
private List<B> bList;
// In B.java class
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="id_a")
@Cascade(CascadeType.SAVE_UPDATE)
private A a;
现在是“问题”:
- a、 getId()->当前新id正常
- a、 getBList()->仍然为空
A a=new A();
// setting A
B b=new B();
// setting B
b.setA(a);
session.save(b);
A loadedA=(A)session.get(A, a.getId());
但是loadedA仍然有一个空bList,比如a
当然,为了避免这个问题,我以你的方式:
A a=new A();
// setting A
B b=new B();
// setting B
List<B> bList=new ArrayList<B>();
bList.add(b);
a.setBList(bList);
session.save(a); // this save a and b
这两个操作当然不是在同一个方法中,都是由gui事件触发的
明白,真正的解决方案是什么吗?
我(可能)做错了
更新
正在删除会话。删除(b)问题再次得到解决。。。那么,Correct的方法是什么?
我知道…我完全不喜欢冬眠..哦。。。嗯
session.refresh(a);
这工作很好。。。这就是解决方案,不是吗?处理双向关联时,必须在关联的两侧设置链接:
A a = new A();
B b = new B();
a.getBList().add(b);
b.setA(a);
session.persist(b);
实际上,常见的模式是实施如下防御链路管理方法:
public class A {
@OneToMany(mappedBy="a", fetch=FetchType.LAZY)
@Cascade(CascadeType.SAVE_UPDATE)
private List<B> bList = new ArrayList<B>();
protected List<B> getListB() {
return bList;
}
protected void setListB(List bList) {
this.bList = bList;
}
public void addBToBs(B b) {
bList.add(b);
b.setA(this);
}
//...
}
这将在Hibernate教程中讨论:
A a = new A();
B b = new B();
a.getBList().add(b);
b.setA(a);
session.persist(b);
public class A {
@OneToMany(mappedBy="a", fetch=FetchType.LAZY)
@Cascade(CascadeType.SAVE_UPDATE)
private List<B> bList = new ArrayList<B>();
protected List<B> getListB() {
return bList;
}
protected void setListB(List bList) {
this.bList = bList;
}
public void addBToBs(B b) {
bList.add(b);
b.setA(this);
}
//...
}
A a = new A();
B b = new B();
a.addBToBs(b);
session.persist(b);