当前位置: 首页 > 面试题库 >

JPA 2.0 / Hibernate:为什么开箱即用LAZY进行“ @OneToOne”获取?

樊宏邈
2023-03-14
问题内容

我的问题是关于具有Hibernate,@ OneToOne关系和延迟加载的JPA 2.0。

首先我的设置:

  • Spring 3.0.5。发布
  • SprnigData JPA 1.0.1.RELEASE
  • 休眠3.5.2-最终
  • DBMS:PostgreSQL 9.0

最近,我遇到了一个事实,即@OneToOne关系无法以惰性方式(FetchType.LAZY)来获取,至少没有字节码检测,编译时间编织等。许多网站都这样说,例如:

  • http://community.jboss.org/wiki/SomeExplanationsOnLazyLoading一对一
  • http://justonjava.blogspot.com/2010/09/lazy-one-to-one-and-one-to-many.html

事情是,在我的设置中,@ 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的列,则延迟加载将按照您所说的“即开即用”的方式工作,但反之则不起作用。



 类似资料:
  • 问题内容: 我的问题是关于具有Hibernate,@ OneToOne关系和延迟加载的JPA 2.0。 首先我的设置: Spring 3.0.5。发布 SprnigData JPA 1.0.1.RELEASE hibernate3.5.2-最终 DBMS:PostgreSQL 9.0 最近,我遇到了一个事实,即@OneToOne关系不能以惰性方式(FetchType.LAZY)来获取,至少没有字节

  • 问题内容: 尝试序列化作为JPA实体的ESRBRating对象时,我遇到了两个不同的堆栈跟踪(请参见下文)。我正在使用Spring DataJPA。控制器称为服务,服务称为存储库。通过在我的ESRBRating对象上添加@Proxy(lazy = false),我能够解决此问题。 我的主要问题是@Proxy(lazy=false)实际做什么?为什么添加时起作用?这是一个好的解决方案,还是会产生诸如

  • 我以ServletContainer的身份从Tomcat切换到Jetty,并尝试使用Jetty的所有默认设置启用SPDY。以下是启用SPDY的步骤: > 我下载并解压缩Jetty 我在webapps中复制了一个。war文件和一些只针对项目的部署描述符。 (现在是棘手的部分)我通过执行以下命令来启用SPDY: java-jar start.jar--add-to-startd=spdy 我接受不受信

  • 问题内容: 我正在寻找一个清晰,简洁和准确的答案。 理想情况下,作为实际答案,尽管欢迎提供指向良好解释的链接。 问题答案: 装箱的值是对原始类型*进行最小包装的数据结构。装箱的值通常存储为指向堆上对象的指针。 因此,盒装值使用更多的内存,并且至少要进行两次内存查找才能访问:一次获取指针,另一次跟随该指针到达原语。显然,这不是您想要在内部循环中执行的操作。另一方面,带框值通常会与系统中的其他类型一起

  • 考虑和<代码>雇员< /代码>和<代码>地址< /代码>关系。在和之间有一对一的映射。以下是模型: 现在,当我执行以下HQL查询时,它会在内部生成两个查询。一个取员工,另一个取地址。 由Hibernate生成的SQL查询 因为我使用的是,所以我希望Hibernate只执行一个带有JOIN的查询,一次性获取员工和地址数据。 你知道为什么它要执行两个查询吗?我如何让Hibernate使用join只执行