2011-01-19 9 views
3

私はJPAが期待通りに動作しないことを認識しています。セッション内で単一のエンティティの複数のインスタンスが終了することがよくあります。ここで Java JPA/Hibernate:セッション内のエンティティの複数インスタンスを回避するにはどうすればよいですか?

は、研究のケースです:親は、単一の方法では@OneToMany

にマッピングされた子のコレクションを持っています

  • 親P エンティティ
  • 負荷コレクションのインスタンスを取得します親子Pを持つ最適化されたJPAクエリを持つ特定の子を見つける:Child C = dao.getSpecificChild(P)

ここでは、Cが既にロードされている2つのインスタンス(C1またはC2)の1つであると考えます。私は、JPAが現在のセッションで既に存在するインスタンスをチェックすると思っていました。 しかし、JPAはCの新しいインスタンスをロードします(C1またはC2のどちらの場合でも問題ありません)。

だから私はC.

の2つの異なるインスタンスで終わるという私の質問は:これは正常な動作ですか? そうであれば、セッション内のエンティティインスタンスをどのように調整できますか?

歓声

+0

親P&dao.getSpecificChild(P)のインスタンスが同一または異なるエンティティマネージャーを使用してフェッチされます –

答えて

2

どのように私は セッションで私のエンティティインスタンスを両立 ことができますか?

あなたはエンティティbにエンティティaから状態を転送したい場合は、以下の操作を行うことができます

entityManager.merge(a); 
entityManager.refresh(b); 
+0

不完全な動作のように見えるものを私に修正する良いオプションと思われます!乾杯 – nodje

0

私もCのインスタンスが以前の一つであることがクエリから返さ期待すでにトランザクションに登録されているため、Cn(同じtxnと仮定)が返されます。これはDataNucleusが(JDOも実装されているため仕様に含まれているため)L1キャッシュが使用するものです。