我的问题是关于具有Hibernate,@ OneToOne关系和延迟加载的JPA 2.0。
首先我的设置:
最近,我遇到了一个事实,即@OneToOne关系不能以惰性方式(FetchType.LAZY)来获取,至少没有字节码检测,编译时间编织等。许多网站都这样说,例如:
事情是,在我的设置中,@ 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" ) ); }
这个测试用例是成功的,并且在Hibernates SQL日志记录输出中,我可以清楚地看到,“ avatarImage”将不会被提取,只是“ user”(仅一个SELECT,没有JOIN,无法访问“ AvatarImage”表)等等。)
User类中的单向@OneToOne关系商店如下所示:
@OneToOne( cascade = CascadeType.ALL, fetch = FetchType.LAZY ) private AvatarImage avatarImage;
因此,一切都很简单-似乎可行。
再说一遍我的问题:为什么它起作用,为什么尽管用@OneToOne关联引用了“ AvatarImage”?
我非常感谢您可以提供的任何帮助
非常感谢!
延迟加载OneToOne关系的问题仅在关系的相反部分(用mappingBy属性标记的关系)上。在关系的拥有方面,它工作正常。两者之间的区别在数据库级别很明显。在您的情况下,问题是User数据库表是否将AvatarImage的ID作为列之一或相反。如果User表的ID为AvatarImage的列,则延迟加载将按照您说的“即开即用”的方式工作,但反之则不起作用。