我使用了这个 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页)
以检查基础数据库中作为元组的存在。选择上述哪一种方法将取决于代码/应用程序的上下文。
希望对您有所帮助。