我的问题是关于JPA 2.0与Hibernate,@ OneToOne关系和延迟加载.
@H_404_2@首先我的设置:
@H_404_2@> Spring 3.0.5.RELEASE
> SprnigData JPA 1.0.1.RELEASE
> Hibernate 3.5.2-最终版
> DBMS:Postgresql 9.0 @H_404_2@我最近发现,@ OneToOne关系不能以懒惰方式(FetchType.LAZY)获取,至少没有字节代码检测,编译时编织等.许多网站都说这个,例如: @H_404_2@> 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 @H_404_2@事情是,在我的设置下,@OneToOne实体的延迟加载似乎“开箱即用”,我真的想了解原因.请看看我的单元测试:
> SprnigData JPA 1.0.1.RELEASE
> Hibernate 3.5.2-最终版
> DBMS:Postgresql 9.0 @H_404_2@我最近发现,@ OneToOne关系不能以懒惰方式(FetchType.LAZY)获取,至少没有字节代码检测,编译时编织等.许多网站都说这个,例如: @H_404_2@> 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 @H_404_2@事情是,在我的设置下,@OneToOne实体的延迟加载似乎“开箱即用”,我真的想了解原因.请看看我的单元测试:
@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" ) ); }@H_404_2@这个测试用例是成功的,在Hibernates sql日志输出中,我可以清楚地看到,“avatarImage”不会被提取,只是“用户”(只有一个SELECT,没有JOIN,没有访问“AvatarImage”表)等等.) @H_404_2@User类中的单向@OneToOne关系服务如下所示:
@OneToOne( cascade = CascadeType.ALL,fetch = FetchType.LAZY ) private AvatarImage avatarImage;@H_404_2@所以,一切都很简单 – 它似乎工作. @H_404_2@重复我的问题:为什么它可以工作,为什么可以懒惰地取出“AvatarImage”,尽管它是用@OneToOne关联引用的? @H_404_2@我非常感谢您提供的任何帮助 @H_404_2@非常感谢!