【问题标题】:jpa/hibernate load eagerly whole chain in auto relashionshipjpa/hibernate 急切地加载关系中的整个链
【发布时间】:2016-11-28 12:55:20
【问题描述】:

我正在使用 JPA 实体图来急切地加载关系。

但是,我的问题是:

关系是这样的自关系:

public class X{

     ...

     @OneToOne
     @JoinColumn(name = "foreign_key")
     protected @Getter @Setter X parent;

     @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
     private @Getter @Setter Set<X> children;
}

所以,当我从数据库中获取对象 X 时,孩子也会被加载。这是对的。但是,当我获得 children Set 的第一个对象并获得他们的孩子时,hibernate 会在数据库中执行另一个查询。

我的实体类是这样注释的:

@NamedEntityGraph(
        name = "cobranca-com-lancamentos-com-filhos",
        attributeNodes = {
            @NamedAttributeNode(value = "children")
        }
    )

我的搜索是这样的:

em.createQuery("FROM X WHERE id = " + id).setHint("javax.persistence.fetchgraph", em.getEntityGraph("cobranca-com-lancamentos-com-filhos")).getSingleResult();

有什么想法吗?

【问题讨论】:

    标签: hibernate jpa eager-loading entitygraph


    【解决方案1】:

    你说你想急切地加载孩子。但是在您明确设置 FetchType.LAZY 的代码中 - 那么您是要加载 eagerly 还是 lazy

    因为您使用休眠,所以您将获得孩子的代理。当您第一次使用 Set 时(是使用 size() 还是其他任何东西),子组件会加载 LAZY,就像您使用 FetchType.LAZY 定义的那样。

    【讨论】:

    • 我想在那个特定的查询中急切地加载。因此,我正在使用 JPA 命名实体图。当我使用 X 对象的 children Set 时,hibernate 不会查询数据库,就像我说的,这是正确的,我想要这个。但是当我得到一个children Set的元素并遍历他们的children Set时,hibernate查询数据库,这就是我不想要的,明白吗?
    猜你喜欢
    • 2013-04-28
    • 2021-04-28
    • 2013-10-07
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 2014-01-26
    相关资源
    最近更新 更多