JPA EntityManager.detach() 仍然加载惰性关系

标签 jpa eclipselink entitymanager jboss-arquillian

我遇到了一个与我对其工作原理的理解相悖的问题。我有一个 Arquillian 测试,它使用 JPA 查询测试存储库方法。

测试持久化一个对象,然后将另一个对象与字段中的第一个持久化对象一起持久化。然后它调用存储库方法。接下来,测试分离(并清除实体管理器,检查对象是否不包含在 em 等中)。最后测试检查相关对象是否存在(不应该存在,因为查询不应该读取关系)。

正如预期的那样,在调试器中查看时,相关对象为 null,但当断言实际使用 getRelatedObject 方法时,会加载相关对象。

伪代码来澄清(我希望):

FirstObject f = new FirstObject();
em.persist(f);
SecondObject s = new SecondObject();
s.setFirstObject(f);
em.persist(f);
MyRepo r = new MyRepo();
SecondObject result = r.runQuery(f.getId());
em.detach(result); //result.getFirstObject is null
em.clear();
assertIsNull(result.getFirstObject()); //loads first object and test fails

我的理解是否错误,相关对象是否仍应加载?我预计会出现 LazyInit 异常。

如果我的理解是错误的,如何验证查询不会填充相关对象,我不会?

(是的,使用 dto-objects 而不是实体更好,我知道......我们已经进行过讨论,但我被否决了)

最佳答案

本书 Pro JPA 2(Apress,第 160 页)笔记

"The behavior of accessing an unloaded attribute when the entity is detached is not defined. Some vendors might attempt to resolve the relationship, while others might simply throw an exception or leave the attribute uninitialized."

我个人没有 EclipseLink 的经验,可以在该领域的文档中找到任何明确的内容,但是以下链接都表明,当您访问独立集合上的惰性关联时,EclipseLink 将尝试解决该关系。

Eclipselink Lazy Loading

http://issues.apache.org/jira/browse/OPENJPA-2483

http://blog.ringerc.id.au/2012/06/jpa2-is-very-inflexible-with-eagerlazy.html

关于JPA EntityManager.detach() 仍然加载惰性关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37562870/

相关文章:

java - 在 Spring Data 中是否可以使用实体的唯一属性删除实体?

java - JPA 错误 : relation does not exist

java - 来自数据库的实体类

java - 外部 JAR 中的 JPA 实体

java - JPA 在一个项目中插入触发器之前执行,并在另一个项目中具有不同的行为

java - 如果只是为了搜索,是否值得将实体放在 @Transactional 服务层下?

java - Eclipselink Maven 没有名为 EntityManager 的持久性提供程序

java - JPA枚举序数与字符串

java - Spring Webflux 中实体管理器的问题

java - 每个实体一个 DAO——如何处理引用?