JPA自动加载懒惰集合

时间:2015-06-27 10:57:42

标签: java hibernate spring-mvc 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,但不能再次初始化类别?

1 个答案:

答案 0 :(得分:1)

当您将子项标记为延迟并加载父项时,子列表将永远不会为空。它会将您的代理返回到子对象列表。因此,当你执行getProductList时,它将调用代理上的get,这将最终加载你的孩子。

使用配置,当您获取所有类别的保证时,您的productList将不会加载,它只会在您访问getProductList时加载。

[更新] 您可以按照网址阅读&#34; Hibernate中的Lazy Loading如何工作&#34; Hibernate and Lazy loading。这可能会帮助您澄清延迟加载。如果在关闭加载它的hibernate会话后访问延迟加载的元素,最终会得到LazyInitializationException