如何在JPA/Hibernate中找出实体是否已分离?

Mar*_*tus 38 java hibernate jpa

有没有办法查询JPA EntityManager是否分离给定的实体?这篇SO帖子正在讨论一个类似的问题,但没有说明在实体的分离状态下查询JPA EntityManager的方法.我更喜欢JPA方式,否则特定于Hibernate.

Pio*_*cki 43

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

  • -1这不是问题的正确答案.原因:`contains()`如果实体是分离的,它确实会返回false**但在其他情况下它也会返回false**.根据规范,如果管理给定实体,`contains()`返回.分离的实体只是实体被视为不受管理的几个原因之一. (25认同)

Ste*_*ers 14

Piotr Nowicki的答案提供了一种确定实体是否被管理的方法.为了确定实体是否已被分离,我们需要知道它是否先前已被管理(即来自数据库,例如通过持久化或从find操作获得).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
}
Run Code Online (Sandbox Code Playgroud)

以上假设emEntityManager,Entity是实体类,并且具有id作为@GeneratedValue主键的公共字段.(它还假定在分离实体后,外部进程没有从数据库表中删除具有此ID的行.)