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

时间:2012-10-30 08:38:07

标签: java hibernate jpa

有没有办法查询JPA EntityManager 是否分离给定实体? This SO post正在讨论类似问题,但未指明在实体的分离状态上查询JPA EntityManager 的方法。我更喜欢JPA方式,否则特定于Hibernate。

2 个答案:

答案 0 :(得分:40)

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

答案 1 :(得分:13)

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
}

以上假设emEntityManagerEntity是实体类,并且公共id字段是@GeneratedValue主键。 (它还假定在分离实体后的时间内,外部进程尚未从数据库表中删除具有此ID的行。)