It'*_*eto 7 java hibernate jpa lazy-loading
我的问题是关于JPA 2.0与Hibernate,@ OneToOne关系和延迟加载.
首先我的设置:
我最近发现这样一个事实:@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" ) );
}
Run Code Online (Sandbox Code Playgroud)
这个测试用例是成功的,在Hibernates SQL日志输出中,我可以清楚地看到,"avatarImage"不会被提取,只是"用户"(只有一个SELECT,没有JOIN,没有访问"AvatarImage"表)等等.)
User类中的单向@OneToOne关系服务如下所示:
@OneToOne( cascade = CascadeType.ALL, fetch = FetchType.LAZY )
private AvatarImage avatarImage;
Run Code Online (Sandbox Code Playgroud)
所以,一切都很简单 - 它似乎工作.
重复我的问题:为什么它可以工作,为什么可以懒惰地取出"AvatarImage",尽管它是用@OneToOne关联引用的?
我非常感谢您提供的任何帮助
非常感谢!
小智 8
延迟加载OneToOne关系的问题仅在于它的反向部分(用mappedBy属性标记的那个).它在关系的拥有方面运作良好.这些之间的差异在数据库级别上是明确的.在您的情况下,问题是用户数据库表是否将ID为AvatarImage作为其中一列或反之.如果User表有一个id为AvatarImage的列,那么延迟加载将像你说的"开箱即用"一样工作,但它不会反过来工作.
| 归档时间: |
|
| 查看次数: |
5672 次 |
| 最近记录: |