2016-07-06 24 views
0

私は現在の永続コンテキストと、必要であればエンティティの存在をサポートするデータベースの両方を検索したいと思います。これはスタンドアローンのjava-seアプリケーションです。 (java-eeアプリケーションコンテナでは動作しません)スレッドセーフであることを心配する必要はありません。 EntityTransactionのコンテキスト内でデータベースをクエリする必要はありますか?entityManager.find()を呼び出すにはEntityTransactionが必要ですか?

基本的な違いがありますか?それが必要とされていない読むだけ操作のための

entityManager.getTransaction.begin(); 
MyEntity me = entityManager.find(MyEntity.class, myEntity.getPrimaryKey()); 
entityManager.getTransaction.commit(); 

答えて

1

はありません。 ないに動作を回っているタイプFORE_VERSION_INCREMENTまたはいくつかの他のより高いレベルのロックのロックを配置

のみ読み取られます。この場合、トランザクションが必要です。

1

findにトランザクション処理が必要な特定の状況(ロックを含む)があります。

それを提供find方法は、(ロックなしを起動またはで呼び出される:我々は見つけるセクション3.1.1(79ページ)で公式JPA specification(最終版、JPA 2.1)を参照

LockModeType.NONE) とgetReferenceメソッドはで、トランザクション内で呼び出される必要はありません。です。シナリオでは

あなたはEntityTransactionなしem.find(..)を呼び出すことが安全である説明。

希望します。

+0

あなたが言及した状況ではREAD_ONLYではないので、私の答えは100%正しいです。あなたがロックを置いた瞬間、バージョンフィールドはジャンプし、操作はもはやREAD_ONLYにならなくなります。したがってトランザクションが必要になります。しかし、READ_ONLY操作を続ける限り、トランザクションは必要ありません。そして、あなたが私をもう一度読んだら、これは私のポストで「読まれている限り、トランザクションは必要ない」と言ったことです。 –

関連する問題