1

したがって、アノテーションを使用して、クラスが次のようなトランザクションを必要とすることを指定しています。

@TransactionAttribute (TransactionAttributeType.REQUIRED)
public class Foo() {
...
}

データベースに実際に変更を加えるそのクラスのコードの一部では、それらの変更がそのクラスのコードの他の部分 (場合によっては次の行) には表示されないことがわかりました。そのため、クエリをフラッシュすることで何とか機能させることができましたが、それは本当に奇妙に感じます。アノテーションによってトランザクションが正しく動作することを期待していましたが、機能させるには多くの操作を行う必要があるようです。

私はGoogleで検索するのに多くの時間を費やしましたが、私が見つけたのは、この注釈をコードではなくxmlファイルで使用することです。誰かがコードの動作を説明してくれるか、少なくとも @ アノテーションを具体的に扱っている Web サイトを教えてくれることを願っています。

編集: JBoss と hibernate を使用しています。動作しないコードの簡単なサンプルを次に示します。

System.out.println("before:" + some_obj.getName());
util = (UtilFacade) EJBFactory.lookup(UtilFacadeBean.class);
some_object.setName("changed");
util.persistEntity(some_obj);
util.refreshEntity(some_obj); // reloads the object to get fresh data
System.out.println("after:" + some_obj.getName());

このコードからの出力は次のようになります。

>>before:start name
>>after:start name

しかし、2 つ目は >>after:changed と表示されることを期待していました

util.flush(); を追加することで、これを回避することができました。util.persistEntity() の呼び出し後。

util の呼び出しは、hibernate API を利用する EntityManager に依存しています。

私の質問が明確でない場合は、さらに知りたいことをお知らせください。編集に取り組みます。

前もって感謝します!

4

2 に答える 2

2

UtilFacade何が行われるかはわかりませんが、またはとが呼び出さpersistEntity()れた場合、 は永続コンテキストで行われた変更をデータベースの値で上書きし、永続コンテキストで行われた変更は保存されないため、正しい動作が得られます。フラッシュされるまでデータベースに保存されるため、呼び出されたときにデータベースには古い値が含まれています。persist()save()refreshEntity()refresh()refresh()refresh()

于 2010-12-22T15:46:36.077 に答える
0

そのため、さらに詳しく調べると、フラッシュ モードを設定する必要がありました。確認した動作から、デフォルトは FlushMode.MANUAL であり、AUTO または ALWAYS のいずれかにする必要があると考えています。頭がぐるぐるしていますが、今は気分が良くなりました:P

于 2010-12-22T16:09:05.840 に答える