gpt4 book ai didi

java - JPA自动加载惰性集合

转载 作者:行者123 更新时间:2023-11-30 08:06:05 25 4
gpt4 key购买 nike

我有两个具有以下关系的实体:

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时,它不为空?在我使用 Criteria 后,我仍然得到相同的结果。如何获取所有类别但不自动初始化productList?之后如何设置productList但不再次初始化Category?

最佳答案

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

根据您的配置,当您获取所有类别时,放心,您的productList不会加载,它只会在您访问getProductList时加载。

[更新]您可以按照该 url 阅读“Hibernate 中延迟加载如何工作”部分 Hibernate and Lazy loading 。这可能会帮助您阐明延迟加载。如果您在关闭加载元素的 hibernate session 后访问延迟加载的元素,您将最终得到 LazyInitializationException

关于java - JPA自动加载惰性集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31087977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com