JPA:EntityManager.find()是否始终为同一个键返回相同的对象引用?

时间:2010-11-19 16:00:54

标签: java orm jpa toplink-essentials

我有一个DAO的集成测试,我在其中使用共享的EntityManager(通过Spring,使用SharedEntityManagerCreator)。测试类标记为@Transactional,测试中的DAO方法也是如此。

在测试类和DAO中,我正在按如下方式检索用户实体:

User user = em.find(User.class, "test");

在我的测试设置中,我修改了用户对象,但是当测试开始运行时,我没有看到DAO中的修改。原来,这两个引用没有引用同一个对象;我在测试课中使用以下方法证明了这一点:

System.out.println("User objects equal = " + (user == dao.getUser()));

这打印出来的错误。我希望每次使用相同密钥对EntityManager的调用都会返回相同的对象引用,并且很惊讶(并且有点惊慌!)发现情况并非如此。任何人都可以对此有所了解吗?我已经重构了我的代码所以它实际上并不是一个问题(DAO本应该没有其中的User对象)但是我仍然希望更好地理解它。

谢谢!

Java 1.6u22,Toplink Essentials 2.0.1,Spring 2.5.6

2 个答案:

答案 0 :(得分:6)

find()在持久性上下文范围内返回相同的实例

对于共享EntityManager(容器管理的事务范围持久化上下文,在JPA Spec术语中),持久化上下文的生命周期绑定到事务,因此find()在调用时返回相同的实例来自同一笔交易。 我想在您的情况下,您的测试设置不会发生在与测试方法相同的事务中,因此find()会生成不同的实例。

答案 1 :(得分:0)

不,不。无论如何,你应该依赖于对象EQUALITY而不是IDENTITY。覆盖equals方法。