[英]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.