簡體   English   中英

JPA自動加載的惰性集合

[英]JPA auto loaded lazy collection

我有兩個具有以下關系的實體:

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?

當您將一個子級標記為懶惰並加載父級時,子級列表將永遠不會為空。 它將使您返回到子對象列表的代理。 因此,當您執行getProductList時,它將調用代理上的get,這將最終加載您的孩子。

使用該配置時,放心獲取所有類別時,不會加載productList,只有在訪問getProductList時才會加載。

[更新]您可以按照url並閱讀“延遲加載如何在Hibernate中工作”部分的休眠和延遲加載 這可能有助於您闡明延遲加載。 如果您在關閉休眠的會話后訪問延遲加載的元素,則將導致LazyInitializationException

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM