2011-07-22 7 views
0

Spring/Hibernateアプリケーションを開発していますが、既存のオブジェクトを更新しようとすると予期しない動作が発生しています。Hibernate Transactionもオブジェクトの変更を永続化する

現在、私は次のように単にオブジェクトを更新サービスクラスのメソッドを持っています。

@Transactional 
public void updateToDoCompletion(long id, boolean completed){ 
    ToDo todo = getEntityManager().find(ToDo.class, id); 
    if (todo!=null){ 
     todo.setCompleted(completed); 
    } 
} 

私の理解では、トランザクションは、メソッドの周りに開始され、ToDoのオブジェクトは(トランザクション内で)ロードされていることで、そのオブジェクトに加えた変更は、トランザクションが終了すると永続化されます(この場合、メソッドはコントローラクラス内のトランザクションの外から呼び出されているので、トランザクションはこのメソッドのために終了すると思います)。

ただし、上記を実行すると、オブジェクトの変更がデータベースに永続化されることはありません。

興味深いことに、トランザクションの終了時に、このアップデートは、(予想トランザクション境界などの面で)ほぼ同じセットアップで他の場所で働いているので、次のように私は、メソッドをコードで実験し、更新されました:

@Transactional 
public void updateToDoCompletion(long id, boolean completed){ 
    ToDo todo = getEntityManager().find(ToDo.class, id); 
    if (todo!=null){ 
     todo.setCompleted(completed); 
    } 

    Team t = conService.loadTeam(50l); 
    t.setDescription("test description!"); 
} 

今回は元のオブジェクトに変更を加えた後、別のオブジェクトをロードしてその変更を加えました。予想通りに動作していた他のメソッドには唯一の違いがありました他のクラスのトランザクションメソッド(追加されたコード、conService.loadTeam(50l)は別のサービスクラスのトランザクションメソッドです)さて、ToDoオブジェクトの元の変更は、私が望むように永続化されていますが、Teamオブジェクトの変更は反映されません。

だから私の質問は以下のとおりです。

  1. は、私は乱暴に休止取引のいくつかの概念を誤解したことがありますか?
  2. なぜ、他のトランザクションconServiceクラスへの呼び出しを追加すると、元のオブジェクトは永続化され始めます。
  3. チームオブジェクトの変更が永続化されないのはなぜですか? (私はここでこのコードを作成したいのですが、上で起こっている正確に理解するために興味を持っていけないOBV)

おかげ

答えて

0

他のサービスクラスへの呼び出しの添加がいたかのように[OK]を、それはそう私はプロジェクトをきれいにしてサーバーを再起動すると元のコードが正常に動作するようになりました。

他に誰かがこれを見つけましたか?私はElcipse GallileoとTomcatを使用しています。