0

我正在使用 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();

任何想法?

4

1 回答 1

0

你说你想急切地加载孩子。但是在你明确设置的代码中FetchType.LAZY——那么你是想急切地加载还是懒惰地加载?

因为您使用休眠,您将获得孩子的代理。第一次使用 Set (是它size()还是其他任何东西)时,孩子们被加载LAZY,就像你用FetchType.LAZY.

于 2016-11-28T13:42:08.107 回答