【发布时间】:2010-06-19 18:15:09
【问题描述】:
我有关系:
// 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 a=new A();
// setting A
B b=new B();
// setting B
b.setA(a);
session.save(b); // this save b and a obviously
现在是“问题”:
- 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 仍然有一个 NULL 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
这种方式一切正常,但我的问题是: 为什么保存操作后 ID 正确更新且 bList 没有? 我必须使用 select 语句查询 db 才能正确重新加载 A 实例?
更新
我有这个例外
StaleStateException:批量更新 从返回意外的行数 更新
当我从中删除 b 后尝试保存或更新实体 a 时。
// first delete old b record
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
a.getBList().remove(b);
b.setA(null);
session.delete(b);
// session.clear(); // this would solve my problem, but is it correct??
session.getTransaction().commit();
// then insert new b record
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
B b=new B();
a.getBList().add(b);
b.setA(a);
session.saveOrUpdate(a);
session.getTransaction().commit(); // this throw exception
这两个操作当然不是同一个方法,都是被gui事件触发的。
session.clear 是真正的解决方案吗? 我做错了(可能)?
更新
删除 session.delete(b) 问题又解决了……那么,正确的方法是什么? 我知道......我完全不喜欢休眠......
【问题讨论】: