我有一个班级:
@Name("foo")
@Scope(ScopeType.CONVERSATION)
public class Foo {
@In
Session session;
@In
private Conversation conversation;
@RequestParameter
Long barId;
/* outjected fields */
@Out
Bar bar;
/* some attributes and methods */
public void start() {
/* some initializations */
this.bar = (Bar) session.get(Bar.class, barId);
}
public void end() {
/* some actions involving bar and bar.getBaz() */
conversation.end();
}
}
方法start()在对话开始时调用并初始化属性栏(Bar是某个实体类)。然后,bar有一个属性baz,它也是一个实体。
在对话过程中,可能会发生某些其他用户修改与我们的栏相关的baz对象。然后,当调用end()时,bar.getBaz()返回baz的旧(未修改)版本,此外,覆盖它到数据库。
我尝试使用session.flush(),session.merge(bar),session.merge(bar.getBaz())在end()方法中获取baz的修改状态,但没有任何效果。如何避免数据库中的污染?
答案 0 :(得分:1)
很抱歉,我无法提出详尽的答案。我不得不从DB重新加载实体,其中由另一个serverlet修改。我是通过使用JPA的refresh()
方法完成的。
Hibernate会话还提供refresh()
方法。您可能还需要考虑@Version
注释以进行乐观锁定。