我遇到了一个与我对其工作原理的理解相悖的问题。我有一个 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 将尝试解决该关系。
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/