2

我有一堂课:

@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 是某个实体类)。然后, bar 有一个属性 baz ,它也是一个实体。

在对话期间,可能会发生其他一些用户修改与我们的 bar 相关的 baz 对象。然后,当 end() 被调用时,bar.getBaz() 返回的(未修改的)baz 版本,而且,将它覆盖到数据库中。

我尝试使用 session.flush()、session.merge(bar)、session.merge(bar.getBaz()) 在 end() 方法中获取 baz 的修改状态,但没有任何效果。如何避免数据库中的污染?

4

1 回答 1

1

对不起,我无法想出一个详尽的答案。我不得不从另一个 serverlet 修改的数据库中重新加载实体。我通过使用refresh()JPA 中的方法来做到这一点。Hibernate 会话也提供了该refresh()方法。您可能还想考虑@Version乐观锁定的注释。

于 2010-11-28T11:31:57.177 回答