gpt4 book ai didi

jpa - Eclipselink 延迟加载

转载 作者:行者123 更新时间:2023-12-04 00:46:47 26 4
gpt4 key购买 nike

我正在 eclipselink JPA 2 上运行测试,以确定集合的延迟加载是如何工作的。我假设,如果你加载一个实体,那么首先加载所有急切的元素,然后,在 JPA session 中,当你请求或触摸它们时加载惰性元素(以某种方式引用它们,就像获取惰性集合的大小一样)。我遇到的问题是:当我从 session 中分离实体时,惰性集合被加载并且可用,即使我没有要求它?我要么误解了 JSR,要么这是 eclipselink 中的正常行为。通过使用休眠,我知道这不会发生。

EntityManager em = emf.createEntityManager();
AloadTest at1 = em.find(AloadTest.class, pkLazy);

serializeObject(at1,"InSessionLazy");

em.detach(at1);
em.close();

如果我在调试中运行它,并观察我的惰性元素,我可以看到当我访问我的“at1”对象时它们没有加载,但是当我跨过 em.detach(at1) 行时,惰性元素实体已加载。

我的 AloadTest C.D 中有一个已定义的惰性集合。因此:...

@OneToMany(fetch = javax.persistence.FetchType.LAZY, cascade = CascadeType.PERSIST, /*, cascade = CascadeType.ALL, */mappedBy = "aloadtest")
public Set<CloadLazyMultitest> getCloadLazyMultitest() {
return cloadLazyMultitest;
}
public void setCloadLazyMultitest(Set<CloadLazyMultitest> cloadLazyMultitest) {
this.cloadLazyMultitest = cloadLazyMultitest;
}

提前致谢,但我认为如果我没有要求,我不应该加载我的惰性集合。

编辑:我做了你的测试 James,你的间接测试是正确的:

logger.info(" ARE WE LAZY LOADED BEFORE :"+((IndirectSet)at1.getCloadLazyMultitest()).isInstantiated()); 

em.detach(at1);

logger.info(" ARE WE LAZY LOADED AFTER :"+((IndirectSet)at1.getCloadLazyMultitest()).isInstantiated());

以及输出到我的记录器:

17:14:16.707 [main] INFO  c.c.t.j.t.JpaI3EagerAndLazyLoadingTest -  ARE WE LAZY LOADED BEFORE :false

17:14:16.723 [main] 信息 c.c.t.j.t.JpaI3EagerAndLazyLoadingTest - 我们是否在 :true 之后延迟加载

我的意思是?为什么我要加载惰性集合,我不要求集合,只要求父实体。如果我有 2 个或 10 个集合的链,每个集合都被注释为惰性集合,会发生什么情况?我认为这将是一个很大的开销。以前使用 Hibernate 从来都不是问题,但由于 eclipselink 现在是 JPA 引用,我必须基于此构建解决方案。

当然可以分离一个对象,使其“变脏”,进行一些处理并重新附加到一个新 session 。我在“长时间对话”环境中思考更多,可能是无状态 session bean 和 Web 前端?

最佳答案

在查看最新的 EclipseLink 代码时,似乎 detach() 不会触发惰性收集。你应该分离触发它吗?

通常,EclipseLink 允许您在关闭 EntityManger 后访问 LAZY 关系,因此即使您分离了对象,它仍然可以访问关系(除非您序列化它)。

您可以检查关系是否已实例化,

((IndirectSet)at1.getCloadLazyMultitest()).isInstantiated()

在调用 detach() 之前和之后检查这一点。

我不确定您为什么要使用 detach,这是一种非常罕见的方法,它基本上可用于将对象从持久性上下文中驱逐,以避免将其更改写入数据库。

关于jpa - Eclipselink 延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8490532/

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