为什么即使实体包含在数据库中,'EntityManager.contains(..)'也会返回 false?



我使用了这个 JPA:检查实体对象是否已持久化 要知道我是持久还是合并我的实体,会是这样的:

if (!getEntityManager().contains(entity)) {
System.out.println(" PERSIST ");            
} else {
System.out.println(" MERGE ");
}

情况是 - 即使我编辑我的实体 - 它也不会被识别为合并。

它是如何实现的,如何使其发挥作用?

根据 JPA 2.1 规范(PDF 第 72 页),

public boolean contains(Object entity)EntityManager方法执行以下操作:

检查实例是否是属于当前持久性上下文的托管实体实例。

因此,检查不是针对实际数据库执行的,而是针对当前的持久性上下文执行的。

此外,在规范文档的 PDF 第 86 页上,我们发现:

contains方法返回true

• 如果实体已从数据库中检索或已由 getReference 返回,并且尚未删除或分离

• 如果实体实例是新的,并且已在实体上调用了持久方法,或者已将持久操作级联到该实体。

contains方法返回false

• 如果实例已分离

最有可能的是,在执行代码段的调用代码时,您具有分离的实体状态。因此,对contains(..)的呼吁总是评估为false

作为替代方法,您可以使用

  • public <T> T find(Class<T> entityClass, Object primaryKey)(见第66页)
  • public <T> T getReference(Class<T> entityClass, Object primaryKey)(见第68页)

以检查基础数据库中作为元组的存在。选择上述哪一种方法将取决于代码/应用程序的上下文。

希望对您有所帮助。

最新更新