jpa - Eclipselink 延迟加载

标签 jpa eclipselink

我正在 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/

相关文章:

jpa - 重新创建实体类

Hibernate 在某些情况下忽略属性

eclipse - 类路径条目 eclipse.fproj.jdt.libprov.osgi/jpt.jpa 标记为发布/导出,但未在项目类路径上导出

java - MOXy 和 RI 以不同方式处理未引用的静态内部类

java - 无法确定关系属性的目标实体

java - JPA/获取实体列表作为引用

java - hibernate auto create in-memory hsqldb 导致找不到序列

java - 头脑 Storm : Weird JPA problem, 可能是类路径或 jar 版本问题?

java - 为什么 eclipselink 每次重新启动时都会消耗整个 AllocationSize?

jpa - 什么控制标量 JPA native 查询的 List 元素类型?