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()->仍然为空
那么,在这种情况下为什么bList不更新呢

我尝试在保存后重新加载,方式如下:

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教程中讨论:


Blow,在这里您可以很好地了解在使用cascading@blow当前位置请将此作为新问题发布,这确实是一个不同的主题。谢谢您的建议,我的新问题在这里
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);