3

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

在测试类和 DAO 中,我都在检索 User 实体,如下所示:

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

4

2 回答 2

6

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

在共享EntityManager(容器管理的事务范围持久性上下文,在 JPA 规范术语中)的情况下,持久性上下文的生命周期绑定到事务,因此find()在从同一事务调用时返回相同的实例。我猜在您的情况下,您的测试设置不会发生在与测试方法相同的事务中,因此find()会产生不同的实例。

于 2010-11-19T16:17:38.930 回答
0

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

于 2010-11-19T16:05:11.413 回答