我的问题涉及 EntityManager.getReference。鉴于我在一个 JPA session 中,我能否确定对于同一实体和同一主键的 EntityManager.getReference 两次调用,我总是获得相同的 java 对象实例?
对于两个不同的 session ,我怀疑会获得两个不同的 java 对象实例 - 真的是这样吗?
我很想知道一般规则,而不是任何具体的实现是如何工作的。它是否由规范定义? (我自己无法找到它)。
Person p1 = EntityManager.getReference(Person.class, 1L);
Person p2 = EntityManager.getReference(Person.class, 1L);
if (p1 == p2) {
System.out.println("SAME");
} else {
System.out.println("DIFF");
}
最佳答案
是的,这是 JPA 的基本保证——在持久化上下文(即 session、EntityManager
)范围内,托管实体的对象标识与其数据库标识匹配:
getReference()
返回一个托管实例:
此外,这种保证意味着在持久化上下文的范围内,无论您如何获得它(通过 find()
、 getReference()
、 merge()
、查询或关系遍历),您都将获得相同 id 的相同实体实例。
例如,如果您从 getReference()
获得了一个代理,则该实体的所有进一步工作都将通过该代理进行:
Person p1 = EntityManager.getReference(Person.class, 1L);
Person p2 = EntityManager.find(Person.class, 1L);
assertSame(p1, p2);
另见:关于session - EntityManager.getReference 是否总是在 session 中返回相同的实例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11010634/