java - 与 Hibernate @LazyToOne 注释等效的 JPA 是什么?

标签 java hibernate jpa orm lazy-loading

我目前正在使用 Hibernate @LazyToOne 注释。

由于我正在从 Hibernate 切换到 JPA,我想知道 @LazyToOne 在 JPA 中是否可用,或者是否有任何其他注释在 JPA 中提供相同的功能?

最佳答案

@LazyToOneLazyToOneOption

旧版 @LazyToOne 注释提供以下选项:

  • 错误
  • 代理
  • NO_PROXY

LazyToOne annotation

LazyToOneOption.FALSE

FALSE 选项等同于 JPA FetchType.EAGER注释,因此应避免使用它,因为它会导致严重的性能问题。

LazyToOneOption.PROXY

PROXY 选项等同于 JPA [FetchType.LAZY] 策略。但是,您应该更喜欢使用 JPA 的 fetch 属性 @OneToOne@ManyToOne协会代替。

LazyToOneOption.NO_PROXY

在父端使用 @OneToOne 关联时,此策略很有用。

因此,假设您有以下 PostPostDetails 实体:

Post and PostDetails entities

如果 Post 映射了这个一对一表关系的父端:

@OneToOne(
    mappedBy = "post",
    fetch = FetchType.LAZY,
    cascade = CascadeType.ALL
)
private PostDetails details;

即使关联使用了FetchType.LAZY策略,我们也可以看到,如果我们想要获取Post实体:

Post post = doInJPA(entityManager -> {
    return entityManager.find(Post.class, 1L);
});

PostDetails 将被急切获取:

SELECT p.id AS id1_0_0_,
       p.title AS title2_0_0_
FROM post p
WHERE p.id = 1
 
SELECT pd.id AS id1_1_0_,
       pd.created_by AS created_2_1_0_,
       pd.created_on AS created_3_1_0_
FROM post_details pd
WHERE pd.id = 1

这是因为 Hibernate 不知道如何初始化 details 属性,因为它需要决定是使用 null 还是 Proxy,并且唯一的方法是找到那就是发出一个 SELECT 查询。

因此,要解决此问题,我们需要:

  • 启用延迟获取字节码增强
  • 使用NO_PROXY策略

要启用延迟加载字节码增强,我们可以使用这个 Hibernate Maven 插件:

<plugin>
    <groupId>org.hibernate.orm.tooling</groupId>
    <artifactId>hibernate-enhance-maven-plugin</artifactId>
    <version>${hibernate.version}</version>
    <executions>
        <execution>
            <configuration>
                <enableLazyInitialization>true</enableLazyInitialization>
            </configuration>
            <goals>
                <goal>enhance</goal>
            </goals>
        </execution>
    </executions>
</plugin>

而且,我们还需要使用NO_PROXY策略:

@OneToOne(
    mappedBy = "post",
    fetch = FetchType.LAZY,
    cascade = CascadeType.ALL
)
@LazyToOne(LazyToOneOption.NO_PROXY)
private PostDetails details;

有了这个改变,父端 @OneToOne 关联将被延迟获取。

关于java - 与 Hibernate @LazyToOne 注释等效的 JPA 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16391789/

相关文章:

java - JSP中如何处理多个客户端?

java - 基于角色的授权 REST API

java - 如何使 JEE6 javadoc 为 NetBeans 7.0.1 中的常规 JavaSE 项目工作?

java - 在 Junit 测试 Hibernate 之前和之后运行测试插入脚本

java - 不审计 OneToMany 关系有什么缺点?

java - 持有资料 list

hibernate - 在 Hibernate 中更新后如何重新加载 Spring Security Principal?

java - Hibernate 正在寻找表中不存在的 DTYPE 列

JSF 和 JPA 最佳实践

hibernate - EntityManager 不写入数据库