为什么即使实体包含在数据库中,'EntityManager.contains(..)' return 还是 false?

Why does 'EntityManager.contains(..)' return false even if an entity is contained in DB?

我使用了这个JPA:检查一个实体对象是否已经持久化 要知道我是坚持还是合并我的实体,它看起来像这样:

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

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

这怎么可能以及如何让它发挥作用?

根据 JPA 2.1 specification(PDF 第 72 页),

EntityManager 方法 public boolean contains(Object entity) 做:

Check if the instance is a managed entity instance belonging to the current persistence context.

因此,检查不是针对实际数据库进行的,而是针对当前persistence context.

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

The contains method returns true:

• If the entity has been retrieved from the database or has been returned by getReference, and has not been removed or detached.

• If the entity instance is new, and the persist method has been called on the entity or the persist operation has been cascaded to it.

The contains method returns false:

• If the instance is detached.

最有可能的是,在执行代码片段的调用代码时,您有一个 分离的 实体状态。因此,对 contains(..) 的调用总是求值为 false.

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

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

检查底层数据库中是否存在元组。您选择上述哪一种方法取决于您 code/application.

的上下文

希望对您有所帮助。