我有两个关系如下的实体:
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,但不能再次初始化类别?
答案 0 :(得分:1)
当您将子项标记为延迟并加载父项时,子列表将永远不会为空。它会将您的代理返回到子对象列表。因此,当你执行getProductList时,它将调用代理上的get,这将最终加载你的孩子。
使用配置,当您获取所有类别的保证时,您的productList将不会加载,它只会在您访问getProductList时加载。
[更新] 您可以按照网址阅读&#34; Hibernate中的Lazy Loading如何工作&#34; Hibernate and Lazy loading。这可能会帮助您澄清延迟加载。如果在关闭加载它的hibernate会话后访问延迟加载的元素,最终会得到LazyInitializationException