为什么即使实体包含在数据库中,'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.
的上下文
希望对您有所帮助。
我使用了这个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 returnstrue
:• 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 returnsfalse
:• 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.
的上下文希望对您有所帮助。