2016-06-01 15 views
1

私はそれがどのように動作するのかについての私の理解に反する問題を抱えています。私はJPAクエリを使ってリポジトリメソッドをテストするArquillianテストを持っています。JPA EntityManager.detach()は遅延関係をまだロードしています

このテストでは、オブジェクトが永続化された後、フィールドに最初の永続化オブジェクトを持つ別のオブジェクトが保持されます。次に、リポジトリメソッドを呼び出します。次に、テストはデタッチされます(エンティティマネージャをクリアし、オブジェクトがemなどに含まれていないことをチェックします)。最後にテストでは、関連オブジェクトが存在するかどうかがチェックされます(問合せがリレーションを読み取ることになっていないためではありません)。

期待どおり、デバッガを見ると関連オブジェクトはnullですが、アサートが実際にgetRelatedObject-methodを使用すると、関連オブジェクトがロードされます。

擬似コードは(私は願って)明確にする:それは間違っている私の理解、関連するオブジェクトがまだロードする必要があり

FirstObject f = new FirstObject(); 
em.persist(f); 
SecondObject s = new SecondObject(); 
s.setFirstObject(f); 
em.persist(f); 
MyRepo r = new MyRepo(); 
SecondObject result = r.runQuery(f.getId()); 
em.detach(result); //result.getFirstObject is null 
em.clear(); 
assertIsNull(result.getFirstObject()); //loads first object and test fails 

ですか?私はLazyInit例外を予期していました。

私は私の理解が間違っている場合、どのようにクエリが関連オブジェクトを設定していないことを確認する方法はありませんか?

答えて

3

JPA 2 Proの書籍(はい、エンティティの代わりにDTO-オブジェクトを使用して、より良い、私は知っている...私たちはその議論があったと私は却下された)(プレスカンファレンスでは、P160)は

ノート

「他の人が単に例外をスローまたは属性が初期化されていない を残すかもしれないが、実体は を取り外す際に、無負荷の属性にアクセスするための動作が定義されていません。一部のベンダーは、 関係を解決しようとする場合があります。」

私は個人的にEclipseLinkの経験はなく、この領域のドキュメントでは何かを見つけることができますが、次のリンクはすべて、分離コレクションで遅延結合にアクセスするときにEclipseLinkが試行して解決することを示唆しています。

Eclipselink Lazy Loading

http://issues.apache.org/jira/browse/OPENJPA-2483

http://blog.ringerc.id.au/2012/06/jpa2-is-very-inflexible-with-eagerlazy.html

関連する問題