当前位置: 首页 > 知识库问答 >
问题:

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

上官培
2023-03-14

我用了这个JPA:检查一个实体对象是否被持久化或不知道我是否持久化或合并我的实体,它看起来像这样:

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

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

这是如何可能的,以及如何使其发挥作用?

共有1个答案

习旻
2023-03-14

根据JPA 2.1规范(PDF第72页),

EntityManager方法public boolean contains(对象实体)执行以下操作:

检查实例是否是属于当前持久性上下文的托管实体实例。

因此,检查不是针对实际数据库进行的,而是针对当前持久性上下文进行的。

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

contains方法返回true

•如果实体已从数据库中检索或已由getReference返回,且未被删除或分离。

如果实体实例是新的,并且已在实体上调用持久化方法,或者持久化操作已级联到该实体。

contains方法返回false

•如果实例已分离。

最有可能的情况是,在代码段的调用代码被执行的那一刻,您有一个分离的实体状态。因此,的调用包含(…) 总是计算为false

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

  • public

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

希望有帮助。

 类似资料:
  • 这是我的代码: 因为我使用POM设计模式,所以我为此创建了一种方法: 这是超文本标记语言标签: 我的问题是,即使存在WebElement,isDisplayed()也返回false。

  • 问题内容: 我正在使用a 检查我的哈希密码。我有PHP 5.5: 我上车了。我已经检查了posts的值和mysql user_password_hash返回。 我不知道为什么它返回假 有任何想法吗? 问题答案: 手册中的列长度可能是问题所在: 建议将结果存储在可扩展超过60个字符的数据库列中(255个字符是一个不错的选择)。 链接

  • 问题内容: 即使正则表达式应返回true,程序也不会退出。代码有什么问题? 问题答案: 仅当整个字符串与正则表达式匹配时才返回。在你的情况下,你的正则表达式仅代表 一个 字符不是,或。 我怀疑您要检查字符串是否包含您在正则表达式中描述的这些特殊字符之一。在这种情况下,请将您的正则表达式括起来,以使正则表达式匹配整个字符串。哦,您不必逃脱character class内部。

  • 我像这样初始化哈希集: 我的对象(抽象类的子类)的和方法如下所示: 我甚至编写了一个简单的单元测试,它不会给出任何错误: 在我的应用程序中,我有一个方法,我只需将对象添加到: 在另一种方法中,我检查

  • 问题内容: 我刚刚研究OCPJP问题,发现了这个奇怪的代码: 运行代码时,我得到: 当我们比较看起来彼此相同的两件事时,输出如何?什么NaN意思 问题答案: 溢出的操作将生成有符号无穷大,下溢的操作将生成非规范化的值或有符号的零,而数学上没有确定结果的操作将生成NaN。将NaN作为操作数的所有数值运算都会产生NaN。如前所述,NaN是无序的,因此涉及一个或两个NaN返回的数值比较操作以及涉及NaN

  • 我有点困惑php函数布尔瓦尔是如何工作的。考虑以下几点