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

如何在JPA / Hibernate中发现实体是否脱离?

巫马泰
2023-03-14

是否有方法查询JPA EntityManager是否分离给定实体?这篇SO帖子讨论了一个类似的问题,但并没有说明向JPA EntityManager查询实体分离状态的方法。我更喜欢JPA方式,否则会针对Hibernate。

共有2个答案

籍昱
2023-03-14

Piotr Novicki的答案提供了一种确定实体是否被管理的方法。要找出一个实体是否已被分离,我们需要知道它是否以前被管理过(即来自数据库,例如通过持久化或从查找操作中获取)。Hibernate不提供“实体状态历史”,所以简短的答案是没有100%可靠的方法来做到这一点,但在大多数情况下,以下解决方法应该足够了:

public boolean isDetached(Entity entity) {
    return entity.id != null  // must not be transient
        && !em.contains(entity)  // must not be managed now
        && em.find(Entity.class, entity.id) != null;  // must not have been removed
}

上面的假设 em实体管理器实体是实体类,并且具有一个公共 ID 字段,该字段是主键@GeneratedValue。(它还假定在分离实体后的时间内,具有此 ID 的行尚未被外部进程从数据库表中删除。

丁俊智
2023-03-14

要检查给定实体是否由当前的PersistenceContext管理,可以使用EntityManager#contains(Object entity)。

 类似资料:
  • 问题内容: 是否可以查询JPA EntityManager 是否分离了给定的实体?这篇SO帖子正在讨论类似的问题,但没有指出查询实体的分离状态的JPA EntityManager的方法。我希望使用JPA方式,否则将使用Hibernate特定的方式。 问题答案: 要检查给定实体是否由当前实体管理,可以使用。

  • 问题内容: 我有2个实体:EntityA和EntityB。 它们是无关的,出于某些限制,我不能将它们放在继承树中。 但是我需要在同一个JPQL或HQL查询中混合包含两个实体的所有实例的List。JPA甚至直接使用Hibernate是否可以实现? 我需要这样的东西: 有什么提示吗? 问题答案: 好吧,我终于想通了。 足以使实体实现一个公共接口(甚至不需要在Hibernate上声明此接口)。 然后,可

  • 我正在将我们的DAO从使用Hibernate Criteria API迁移到JPA Criteria API。我有一个包含多个的类: 在查询中,我使用的是JoinType。左键以消除默认生成的交叉连接: 我得到了正确的结果,所有的A和B记录都得到了正确的检索。然而,在迁移之后,我遇到了一个问题:尽管在生成的查询中使用了左外连接,但所有的记录都是逐个检索的。以前(使用Hibernate Criter

  • 我想知道在Spring项目中更新JPA实体的最佳实践是什么-更新原始实体还是创建新实体?我看到了这两种方法: 使用原始-在原始实体中实现必要的字段,并将更新后的实体保存回存储库 使用复制-手动创建实体的新实例,将原始实体中的所有字段(更新的字段)设置为新实体,并将实体保存回存储库 您使用/推荐什么方法?为什么呢?

  • 我有一个使用和的Spring Boot应用程序。您可以在这个GitHub存储库中找到整个代码。 我的问题是,如何在没有任何外键的情况下,通过使用结构向特定列添加国际化功能? 例如,我想定义一个JPA实体,如下所示: 然后,对于和地区,列中的数据将按如下方式存储: 然后,当当前区域设置为Köln时,当设置为区域设置时,则在读取数据时获取数据! 此外,当我们存储数据时,传递的字符串以JSON格式存储在

  • 问题内容: 我正在使用Spring + Hibernate+JPA,但遇到无法将实体持久保存到数据库的情况。我已经建立了一个带有@Transactional注释的服务类。它使用包含注入的EntityManager的DAO。当我在服务对象上调用函数时,我看到DAO正在进行大量的选择读取,但是由于我的DAO发出的合并和删除操作,没有更新/删除。当然,我的设置有问题,但是我看不到它。 persisten