当前位置: 首页 > 知识库问答 >
问题:

@OneToOne映射在Hibernate/JPA2.1中延迟加载不起作用?

壤驷凯
2023-03-14

我使用JPA2.1和Hibernate来实现。

举个示例:

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

可嵌入唯一密钥:

@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(),但它仍然在获取父级数据的同时获取子级数据。

在参考了这个答案之后。它说在@OneToOne的情况下,即使我们定义了fetch=fetchType.lazy,它也总是急切地获取数据。

如果它也发生在JPA2.1中,那么使用JPA criteriaBuilder获取惰性的其他方法是什么?

共有1个答案

段干玺
2023-03-14

>

  • 延迟@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实现可以做到这一点。

    如果您的实现不支持这种优化,那么您的方法--是本机查询。有时可以进行本机查询:)

  •  类似资料:
    • 问题内容: 这就是我想要做的。 创建具有与孩子的OneToOne关系的父母 父母必须使用延迟加载来获取孩子 如果父母被删除,孩子也被删除 如果孩子被移走,父母不应该受到影响 级联更新和删除必须转换为DDL 班级家长 班级儿童 我的第1、3、4 点 完全正常工作,而 第5点则 部分正常工作,仍然需要解决如何翻译更新部分indo DDL。 第2点 是这里的大问题,对于我目前的解决方案,父级不会延迟加载

    • 我正在使用模型映射器(http://modelmapper.org/)将具有延迟加载对象列表(通过Hibernate)的实体映射到具有modelmapper.map()的DTO。 输出dto的列表为空值,但实体的列表已填充。当我改为“急切加载”时,一切正常,但我的查询太大,所以这不是一个选项。 有人知道模型映射器如何映射代理的Hibernate实体类吗? 这是我的父实体: 运输署署长: 这是我如何

    • 问题内容: 我的多对一映射存在性能问题。当我在日志文件中调试SQL查询时,可以进行主体查询,但是在我有其他表示多对一对象映射的查询之后。 Entity.hbm.xml: Object1.hbm.xml: Object2.hbm.xml: 查询HBM: 在pom.xml中 问题答案: 您是否尝试过像这样的FetchMode.SELECT?

    • 问题内容: 我正在使用Spring + Hibernate。我所有的HibernateDAO都直接使用sessionFactory。 我有应用程序层->服务层-> DAO层,所有集合都被缓慢加载。 因此,问题在于,有时在应用程序层(包含GUI / swing)中,我会使用服务层方法(包含@Transactional批注)加载实体,并且我想使用此对象的惰性属性,但忽略了会话已经关闭。 解决此问题的最

    • 问题内容: 什么是Java的延迟加载?我不明白这个过程。有人可以帮助我了解延迟加载的过程吗? 问题答案: 假设您有一个父母,而那个父母有很多孩子。Hibernate现在可以“延迟加载”子级,这意味着它在加载父级时实际上并不会加载所有子级。而是在要求时加载它们。您可以显式地请求此请求,或者,更常见的是,当您尝试访问孩子时,hibernate会自动加载它们。 延迟加载可以帮助显着提高性能,因为通常您不

    • 问题内容: 这是用于通过布雷森纳姆算法在计算出的位置上绘制点的代码: 列表“布雷森汉姆”包含所有借助布雷森汉姆线描算法预先计算的点。我想在“ for”循环中设置1秒的延迟,以便在间隔1秒后绘制每个点。“延迟”部分中列出的部分无效。如何使“延迟”工作?更具体地说,我想看到所有的点以1秒的间隔在屏幕上一个接一个地绘制。 问题答案: 我假设您正在某个方法中调用此方法。 只是一个提示: 从来没有睡过油漆过