我使用这个JPA: check whether an entity object has been persisted or not 知道我是否持久存在或合并我的实体,它将如下所示:
if (!getEntityManager().contains(entity)) {
System.out.println(" PERSIST ");
} else {
System.out.println(" MERGE ");
}
案例是 - 即使我编辑我的实体 - 它也不会被识别为合并。
如何才能使它成功?
答案 0 :(得分:5)
根据JPA 2.1 specification(PDF第72页),
EntityManager
方法public boolean contains(Object entity)
执行:
检查实例是否是属于当前持久性上下文的托管实体实例。
因此,不会针对实际数据库进行检查,而是针对当前的 persistence context 进行检查。
此外,在规范文档的PDF页面86中,我们发现:
contains
方法返回true
:•如果已从数据库中检索实体或已由getReference返回实体,并且不已删除或已分离。
•如果实体实例是新实例,并且已在实体上调用了persist方法,或者已将persist操作级联到该实体上。
contains
方法返回false
:•如果实例已分离。
最有可能的是,在执行代码段的调用代码时,您有一个分离的实体状态。因此,对contains(..)
的调用始终评估为false
。
作为替代方案,您可以使用
public <T> T find(Class<T> entityClass, Object primaryKey)
(参见第66页)或 public <T> T getReference(Class<T> entityClass, Object primaryKey)
(参见第68页)将基础数据库中的状态检查为元组。您选择的上述哪种方法取决于您的代码/应用程序的上下文。
希望它有所帮助。