我遇到的问题违背了我对它应该如何工作的理解。我有一个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代替实体更好,我知道......我们已经进行了讨论而且被推翻了)
答案 0 :(得分:4)
“Pro JPA 2”(Apress,p160)一书注释
“实体所在时访问已卸载属性的行为 分离未定义。 有些供应商可能会尝试解决这个问题 关系,而其他人可能只是抛出异常或离开 属性未初始化。“
我没有亲自体验EclipseLink的经验,并且可以在此领域的文档中找到任何明确的内容,但是以下链接都表明当您在分离的集合上访问惰性关联时,EclipseLink将尝试解决该关系。
http://issues.apache.org/jira/browse/OPENJPA-2483
http://blog.ringerc.id.au/2012/06/jpa2-is-very-inflexible-with-eagerlazy.html