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

Con*_*nan 3 java orm jpa toplink-essentials

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

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

User user = em.find(User.class, "test");
Run Code Online (Sandbox Code Playgroud)

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

System.out.println("User objects equal = " + (user == dao.getUser()));
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Java 1.6u22,Toplink Essentials 2.0.1,Spring 2.5.6

axt*_*avt 6

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

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