java - JPA 2.0/hibernate : Why does LAZY fetching with "@OneToOne" work out of the box?

标签 java hibernate jpa lazy-loading

我的问题是关于 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) 获取,至少在没有字节码检测、编译时编织等情况下是这样。许多网站都这样说,例如:

问题是,根据我的设置,@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/

相关文章:

java - JPA 与 Jboss 异常

java - 断言具有嵌套 Map 字段的两个对象不相等

java - 如何将 java.sql.Timestamp 格式化为 (hh :mm AM/PM)

java - 如何通过java代码复制MySQL中新建数据库的数据库结构?

java - Jenkins 无法运行 xml

java - 使用 JPA 进行数据库设计

java - 将 List 对象强制转换为 List Long

java - JPA 保存实体错误

java - 创建名称为 'entityManagerFactoryBean' 的 bean 时出错

java - 两天的 hibernate 训练应该包括什么