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

问题描述 投票:0回答:1

我使用这个JPA: check whether an entity object has been persisted or not 知道我是否坚持或合并我的实体,它将如下所示:

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

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

怎么可能以及如何使它工作?

java jpa entitymanager jpa-2.1
1个回答
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页)

在底层数据库中检查存在是否为元组。您选择上述哪种方法取决于您的代码/应用程序的上下文。

希望能帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.