我的问题是关于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实体的延迟加载似乎工作“开箱即用”,我真的很想理解为什么。请看看我的单元测试:
@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"));
}
这个测试用例是成功的,并在Hibernate的SQL日志输出,我可以清楚地看到,该“avatarImage”会不会牵强,只是“用户” (只是一个单一的SELECT,JOIN没有,到 “AvatarImage” 表等无法访问)
User类单向@OneToOne relationshop看起来是这样的:
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private AvatarImage avatarImage;
所以,一切都非常简单 - 它似乎工作。
重复我的问题:为什么它工作,为什么可以懒惰地提取“AvatarImage”,虽然它是由@OneToOne关联引用的?
我真的很感谢你可以提供的任何帮助
非常感谢!