2010-11-28 8 views
2

中にデータベースから変更を取得することはできません。会話の開始時に呼び出される)SEAM /休止状態:私はクラス持って会話

@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(); 
    }   
} 

メソッドの開始を(属性バーを初期化(バーいくつかのエンティティクラスです)。次に、barにはエンティティでもあるbazという属性があります。

会話中に、他のユーザーがバーに関連するbazオブジェクトを変更することがあります。次に、end()が呼び出されると、bar.getBaz()はの古い(変更されていない)バージョンのbazを返します。さらにをデータベースに上書きします。

session.flush()、session.merge(bar)、session.merge(bar.getBaz())を使用してend()メソッドでbazの変更状態を取得しようとしましたが、何も機能しません。データベースの汚染を避けるにはどうすればいいですか?

答えて

1

申し訳ありませんが、私は精巧な答えでお手伝いできません。別のサーバーレットによって変更されたDBからエンティティをリロードする必要がありました。私はJPAのrefresh()メソッドを使ってこれを行いました。 Hibernateセッションでは、refresh()メソッドも提供されています。オプティミスティック・ロックのための@Versionアノテーションを検討することもできます。

+0

ありがとうございます! session.refresh(bar.getBaz())が機能しました!アプリケーションはすでにプロダクション状態にあり、データベーススキーマは変更できないため、@ Versionを使用できませんでした。 – janek37