2016-03-23 11 views
2

1.私はレイジーアソシエーションを持つ複雑なエンティティを持っています。 @Viewscoped Bean内のプロパティにロードします(デタッチされます)。休止状態でのマージ後のフラッシュの防止

2.iエンティティの一部のフィールドを変更します(まだデタッチされています)。私は怠け者を読み込むことができるようにエンティティをマージする必要が

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public MyEntity loadTheLazyObjects(MyEntity myEntity){ 
    //at the beginning myEntity is detached 
myEntity = entityManager.merge(myEntity) //it is managed now 
myEntity.getSomeLazyCollection.size(); //initialize lazy collection 
entityManager.clear(); //myEntity is detached again 
return myEntity; 
} 

:私は私のエンティティから怠惰なオブジェクトが必要なので、のように私はコンテキストを永続性と怠惰なオブジェクトを初期化するエンティティをマージ

3.Now (私はアクティブな休止状態のセッションが必要ですが)私は自分のエンティティの変更をデータベースに保存したくありません。それはなぜトランザクションの終わりの前に私は永続コンテキストからそれを切り離すのですか?助けてくれる?

トランザクションが終了したときにmyEntityにSQL UPDATEが必要なのではなく、hibernateがマージ後に更新するオブジェクトを準備すると思いますので、トランザクションの終了前にオブジェクトを切り離すとhibernateが更新を起動できなくなりますか?マージ中にフラッシュを呼び出すことはできますか?

+1

オブジェクトはこのように遅延ロードされているため、オブジェクトを取得するために別のクエリを作成することもできます。 mergeを使ってエンティティを更新しない方法がわかりません。 –

+0

マージの目的は、マージすることです。何らかの組み合わせのオブジェクトが必要な場合。責任オブジェクトをデータベースからロードし、自分でマージします。 f.e. ModelMapper –

+0

を 'merge()'の代わりに使うと、対応するエンティティを 'em.find()'することができます( 'em.clear()'まで管理されます)。 –

答えて

3

mergeは暗黙的にflushをトリガーしません。フラッシングは、次の3つの状況で発生します。

  1. 例では、クエリの実行(HQL/JPQLとネイティブクエリ)Hibernateは実行されたクエリは、データベース内の古いデータで作業することができると結論する前に。
  2. flushが明示的に呼び出された場合。
  3. トランザクションがコミットされたとき。

あなたは(あなたが明示的に呼び出さない限り、もちろん、)はフラッシュが発生しないことを絶対に確認したい場合は、manualにフラッシュモードを設定します。

entityManager.unwrap(Session.class).setFlushMode(FlushMode.MANUAL); 

JPAのフラッシュモードは、マニュアルをサポートしていません。これは、HibernateネイティブのSession APIを使用する必要がある理由です。

このようにして、マージ後の永続コンテキストをクリアする必要はなく、変更は一切フラッシュされません。