我有一个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
答案 0 :(得分:6)
find()
在持久性上下文范围内返回相同的实例。
对于共享EntityManager
(容器管理的事务范围持久化上下文,在JPA Spec术语中),持久化上下文的生命周期绑定到事务,因此find()
在调用时返回相同的实例来自同一笔交易。 我想在您的情况下,您的测试设置不会发生在与测试方法相同的事务中,因此 find()
会生成不同的实例。
答案 1 :(得分:0)
不,不。无论如何,你应该依赖于对象EQUALITY而不是IDENTITY。覆盖equals方法。