JPA EntityManager.detach()仍然加载延迟关系

时间:2016-06-01 08:05:02

标签: jpa eclipselink entitymanager jboss-arquillian

我遇到的问题违背了我对它应该如何工作的理解。我有一个Arquillian测试,用于测试带有JPA查询的存储库方法。

测试持久存在一个对象,然后在另一个对象中保留另一个具有第一个持久对象的对象。然后它调用repository-method。接下来测试分离(并清除实体管理器,检查对象是否包含在em等中)。最后,测试检查相关对象是否存在(它不应该是因为查询不应该读取关系)。

正如预期的那样,在查看调试器时,相关对象为null,但是当assert实际使用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代替实体更好,我知道......我们已经进行了讨论而且被推翻了)

1 个答案:

答案 0 :(得分:4)

“Pro JPA 2”(Apress,p160)一书注释

  

“实体所在时访问已卸载属性的行为   分离未定义。 有些供应商可能会尝试解决这个问题   关系,而其他人可能只是抛出异常或离开   属性未初始化。“

我没有亲自体验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