2016-11-28 68 views
0

我正在使用JPA实体图来加速关系。jpa/hibernate在自动重新加载中急切地加载整个链

不过,我的问题是:

的关系是这样的一个自动的关系:

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,孩子来装入太多。这是对的。但是,当我得到儿童的第一个对象设置并获得他们的孩子时,休眠​​确实在数据库中执行另一个查询。

我的实体类anotated本:

@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(); 

任何想法?

回答

0

你说你想急切加载孩子。但在代码中你明确地设置了FetchType.LAZY - 那么你想要加载热切地懒惰

因为你使用hibernate,你会得到一个子代理。第一次使用套装(size()或其他任何东西),孩子们加载LAZY,因为你用FetchType.LAZY定义它。

+0

我想加载只是在特定的查询。因此,我使用JPA命名实体图。当我使用X对象的子集时,hibernate不需要咨询数据库,就像我说的,这是可行的,我想要这个。但是当我得到一个孩子的元素设置和迭代他们的孩子设置,休眠咨询数据库,这是我不想要的,明白吗? –