私の質問は、JPA 2.0とHibernate、@OneToOneの関係と遅延ロードに関するものです。JPA 2.0/Hibernate: "@OneToOne"でLAZYをフェッチするのはなぜですか?
まず私のセットアップ:
- 春3.0.5.RELEASE
- SprnigData JPA 1.0.1.RELEASE
- にHibernate 3.5.2-決勝
- DBMS:PostgreSQLの9.0
私は最近、@OneToOneの関係を少なくともバイトコードを持たない怠惰な方法(FetchType.LAZY)で取り出すことはできないという事実を知りました。 n、コンパイル時の織り込みなどを含む。そこに多くのサイトでは、例えば、これを言う:
- http://community.jboss.org/wiki/SomeExplanationsOnLazyLoadingone-to-one
- http://justonjava.blogspot.com/2010/09/lazy-one-to-one-and-one-to-many.html
- Making a OneToOne-relation lazy
事は私の設定で、ある、@OneToOneエンティティの遅延ロードが動作しているようです"すぐに使える"と私は本当に理由を理解したいと思っています。 、私のユニットテストを見てください。ただ、「ユーザー」、「avatarImageは」フェッチされないこと、
@Test
@Transactional
public void testAvatarImageLazyFetching()
{
User user = new User();
user.setAvatarImage(new AvatarImage());
User = userRepository.save(user);
entityManager.flush();
entityManager.clear();
User loadedUser = userRepository.findOne(user.getId());
assertNotNull(loadedUser);
PersistenceUtil persistenceUtil = Persistence.getPersistenceUtil();
assertTrue(persistenceUtil.isLoaded(loadedUser));
assertFalse(persistenceUtil.isLoaded(loadedUser, "avatarImage"));
}
このテストケースは成功し、休止状態SQLのログ出力中に、私ははっきりと見ることができます(1つだけSELECT、無登録しよう、など「AvatarImage」テーブルへのアクセスなし)
は、Userクラスで単方向@OneToOneのrelationshopは次のようになります。
だから、@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private AvatarImage avatarImage;
、非常に単純なすべてのもの - それはうまくいくようです。
私の質問を繰り返してみてください:それはなぜ動作していますか、なぜ "AvatarImage"は@OneToOne関連で参照されていますが、遅延して取得できますか?
私は本当にあなたが
どうもありがとうを提供することができます任意の助けに感謝します!