有没有办法查询JPA EntityManager是否已将给定实体分离?这篇SO帖子讨论了类似的问题,但没有指示如何查询JPA EntityManager关于实体分离状态的信息。我更喜欢使用JPA方式,否则使用Hibernate特定的方法。
要检查给定实体是否由当前的PersistenceContext
管理,可以使用EntityManager#contains(Object entity)
。
contains()
方法返回false,确实表示该实体已分离,但在其他情况下也会返回false。按照规范,contains()
方法检查给定的实体是否受管理,而分离实体只是导致实体未受管理的几种情况之一。 - MRalwasserPiotr 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
}
上述假设了em
是EntityManager
,Entity
是实体类并具有公共的id
字段,该字段是一个@GeneratedValue
主键。(它还假设在实体被分离后,在数据库表中具有该ID的行没有被外部进程移除。)
EntityManager#contains(-)
吗? - Piotr Nowicki