加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – JPA 2.0 / Hibernate:为什么LAZY使用“@OneToOne”开箱

发布时间:2020-12-15 00:46:31 所属栏目:Java 来源:网络整理
导读:我的问题是关于JPA 2.0与Hibernate,@ OneToOne关系和延迟加载. 首先我的设置: Spring 3.0.5.RELEASE SprnigData JPA 1.0.1.RELEASE Hibernate 3.5.2-最终版 DBMS:PostgreSQL 9.0 我最近发现,@ OneToOne关系不能以懒惰方式(FetchType.LAZY)获取,至少没有字
我的问题是关于JPA 2.0与Hibernate,@ OneToOne关系和延迟加载.

首先我的设置:

> Spring 3.0.5.RELEASE
> SprnigData JPA 1.0.1.RELEASE
> Hibernate 3.5.2-最终版
> DBMS: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的列,那么延迟加载将像你说的“开箱即用”一样工作,但它不会反过来工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读