我的问题是关于 JPA 2.0 与 Hibernate、@OneToOne 关系和延迟加载。
首先我的设置:
- Spring 3.0.5.RELEASE
- SprnigData JPA 1.0.1.RELEASE
- hibernate 3.5.2-Final
- 数据库管理系统:PostgreSQL 9.0
我最近发现,@OneToOne 关系无法以惰性方式 (FetchType.LAZY) 获取,至少在没有字节码检测、编译时编织等情况下是这样。许多网站都这样说,例如:
- 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 实体的延迟加载似乎“开箱即用”,我真的很想了解原因。请看一下我的单元测试:
@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”不会被获取,只是“用户”(只是一个单一的 SELECT,没有 JOIN,没有访问“AvatarImage”表等)
User 类中的单向@OneToOne 关系车间如下所示:
@OneToOne( cascade = CascadeType.ALL, fetch = FetchType.LAZY )
private AvatarImage avatarImage;
所以,一切都非常简单 - 而且它似乎有效。
重复我的问题:为什么它有效,为什么可以延迟获取“AvatarImage”,尽管它是通过@OneToOne 关联引用的?
非常感谢您提供的任何帮助
非常感谢!
最佳答案
延迟加载 OneToOne 关系的问题只出现在它的逆向部分(用 mappedBy 属性标记的部分)。它在关系的拥有方工作得很好。吨 这些之间的区别在数据库级别很明显。在您的情况下,问题是用户数据库表是否将 AvatarImage 的 id 作为列之一或相反。 如果 User 表有一个 ID 为 AvatarImage 的列,那么延迟加载将按照您所说的“开箱即用”的方式工作,但反之则行不通。
关于java - JPA 2.0/hibernate : Why does LAZY fetching with "@OneToOne" work out of the box?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7510131/