在 Hibernate / JPA 2.1 中延迟加载的 @OneToOne 映射不起作用?

Posted

技术标签:

【中文标题】在 Hibernate / JPA 2.1 中延迟加载的 @OneToOne 映射不起作用?【英文标题】:@OneToOne mapping with lazy loading in Hibernate / JPA 2.1 not working? 【发布时间】:2018-07-09 04:14:26 【问题描述】:

我正在使用 JPA 2.1 和 Hibernate 来实现。

举个例子:

我有一个父实体(称为 Parent)和一个子实体(称为 Child)。

UniqueKey 可嵌入:

@Embeddable
@EqualsAndHashCode
@Data
@NoArgsConstructor
public class UniqueKey implements Serializable 

    public UniqueKey(String id1, String id2) 
        this.id1 = id1;
        this.id2 = id2;
    

    @Column(name = "id1")
    private String id1;

    @Column(name = "id2")
    private String id2;

父实体:

@Entity
@Table(name = "parent", uniqueConstraints = 
        @UniqueConstraint(columnNames = 
                "id1",
                "id2"
        )
)
public class Parent implements Serializable 
   @Id
   private UniqueKey key;

   @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns(
            @JoinColumn(name = "id1", referencedColumnName = "id1", insertable = false,
                    updatable = false),
            @JoinColumn(name = "id2", referencedColumnName = "id2", insertable = false,
                    updatable = false)
    )
    private Child child;

子实体:

public class Child implements Serializable 
   @EmbeddedId
   private UniqueKey key;

   @Column(name = "name")
   private String name;

对于 Parent 的某些查询,我需要 child,而对于某些情况,我不需要。

我正在尝试通过 uniqueKey 获取,但没有调用 getChild(),但它仍在与父级一起获取子级数据。

参考this answer后。它说在@OneToOne 的情况下,即使我们定义 fetch = FetchType.LAZY ,它也总是急切地获取数据。因为这是非常古老的答案,所以我不知道 JPA 2.1 是否也会发生这种情况。

如果它也发生在 JPA 2.1 中,那么 Fetch lazy 的其他方法是什么 使用 JPA 标准构建器?

【问题讨论】:

【参考方案1】:
    懒惰的@OnetoOne 与实际工作的关系

    如果您需要从父级中选择UniqueKey 而不获取子级 - 您可以尝试以下操作:

    类 UniqueKeyDto 私有字符串 s1; 私有字符串 s2; UniqueKeyDto(字符串 s1,字符串 s2) // 省略

然后像这样使用 JPQL 查询:

SELECT NEW UniqueKeyDto(p.child.key.s1, p.child.key.s2) FROM Parent p WHERE <conditions here>

这个查询显然可以优化,但我不确定哪些 JPA 实现可以在现实中做到这一点。

如果您的实现不支持这种优化,那么您的方法就是使用本机查询。有时进行本机查询非常好:)

【讨论】:

我需要 CriteriaBuilder 提供而 JPQL 不提供的动态查询。这就是为什么我不喜欢 JPQL。顺便说一句,感谢您的意见。

以上是关于在 Hibernate / JPA 2.1 中延迟加载的 @OneToOne 映射不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

Jpa/Hibernate 字节码增强:字段延迟加载

Spring Boot 2.1 缺少多个 org.hibernate.jpa.event 类

哪个版本的hibernate支持jpa 2.1?

Jersey API + JPA/Hibernate Criteria延迟加载不起作用

使用 FetchType.LAZY 防止 JPA/Hibernate 中的延迟加载(尤其是在使用 @Transactional 时)?

JPA 延迟加载