Подтвердить что ты не робот

Как узнать, отсоединен ли объект в JPA/Hibernate?

Есть ли способ запросить JPA EntityManager, отделяется ли данный объект? Это сообщение SO обсуждает аналогичную проблему, но не указывает способ запроса JPA EntityManager в статусе отсоединения объекта. Я бы предпочел метод JPA, иначе Hibernate-specific.

4b9b3361

Ответ 1

Чтобы проверить, управляется ли данный объект с помощью текущего PersistenceContext, вы можете использовать EntityManager#contains(Object entity).

Ответ 2

Ответ Петра Новицки дает возможность определить, управляется ли объект. Чтобы выяснить, был ли объект отсоединен, нам нужно знать, было ли оно ранее управляемо (т.е. Из базы данных, например, сохранялось или получалось из операции 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 основным ключом. (Он также предполагает, что строка с этим идентификатором не была удалена из таблицы базы данных внешним процессом за время, когда объект был отсоединен.)