2016-11-28 75 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不需要諮詢數據庫,就像我說的,這是可行的,我想要這個。但是當我得到一個孩子的元素設置和迭代他們的孩子設置,休眠諮詢數據庫,這是我不想要的,明白嗎? –