2015-06-27 209 views
1

我有以下兩個實體的關係:JPA自動加載延遲集合

public class Category implements Serializable { 
    @Column(name = "caID") 
    private Integer caID; 
    @OneToMany(cascade=CascadeType.ALL,mappedBy="caID",fetch=FetchType.LAZY) 
    private List<Product> productList; 
    //..... GET and SET   
} 
public class Product implements Serializable { 
    @Column(name = "pID") 
    private Integer pID; 
    @JoinColumn(name = "caID", referencedColumnName = "caID") 
    @ManyToOne(optional = false, fetch = FetchType.EAGER) 
    private Category caID; 
    //..... GET and SET   
} 

分類型號:

private List<Category> findCategoryEntities(boolean all, int maxResults, int firstResult) { 
    EntityManagerFactory eMF = null; 
    EntityManager eM = null; 
    try { 
     eMF = getEntityManagerFactory(); 
     eM = getEntityManager(eMF); 
     Query q=eM.createQuery("SELECT ca FROM Category ca"); 
     //Or using Criteria 
     //CriteriaQuery cq = eM.getCriteriaBuilder().createQuery(); 
     //cq.select(cq.from(Category.class)); 
     //Query q = eM.createQuery(cq); 
     if (!all) { 
      q.setMaxResults(maxResults); 
      q.setFirstResult(firstResult); 
     } 
     return q.getResultList(); 
    } finally { 
     closeConnection(eM, eMF); 
    } 
} 

我想,如果我設置取listProduct的負載是懶惰型,這個屬性贏得」由實體管理器自動加載。但是當我調用方法'findCategoryEntities'並檢查productList時,它不是null?在使用Criteria之後,我仍然得到相同的結果。我如何獲得所有類別,但不能自動初始化productList?那麼如何設置productList,但不能再次初始化Category?

回答

1

當您將孩子標記爲懶惰並加載父級時,子級列表永遠不會爲空。它會將您的代理返回到子對象列表。所以當你getProductList時,它會調用代理上的get,最終會加載你的孩子。

通過配置,您可以在您獲取所有類別放心的時候加載您的productList,它只會在您訪問getProductList時加載。

[更新] 您可以按照網址並閱讀「如何在休眠中加載緩存」部分Hibernate and Lazy loading。這可能會幫助您澄清延遲加載。如果你在關閉加載的休眠會話後訪問延遲加載的元素,你將最終得到LazyInitializationException

+0

我是sory,我使用PersistenceUtil(返回true)方法'isFieldLoaded'檢查productList,或者使用getSize() (大於0),但未檢查相等空:D –

+0

如果我使用Criteria並關閉EntityManagerFactory,productList將自動加載。爲什麼? –

+0

您可以按照網址並閱讀「休眠時如何加載緩存」一節http://howtodoinjava.com/2014/09/26/lazy-loading-in-hibernate/。這可能會幫助您澄清延遲加載。如果您在關閉加載它的hibernate會話後訪問延遲加載的元素,則最終會出現LazyInitializationException –