![](/img/trans.png)
[英]Spring Data JPA - Lazy Loaded collection fetched without @Transactional
[英]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.