Gibt es eine Möglichkeit, den JPA EntityManager abzufragen, ob eine bestimmte Entität entkoppelt ist? Dieser SO-Beitrag diskutiert ein ähnliches Problem, gibt jedoch keinen Hinweis auf eine Möglichkeit, den JPA EntityManager zum Ablösestatus einer Entität zu befragen. Ich bevorzuge einen JPA-Weg, ansonsten hibernate-spezifisch
Antworten
Zu viele Anzeigen?Um zu überprüfen, ob die angegebene Entität vom aktuellen PersistenceContext
verwaltet wird, können Sie die EntityManager#contains(Object entity)
Methode verwenden.
Die Antwort von Piotr Nowicki bietet eine Möglichkeit festzustellen, ob eine Entität verwaltet wird. Um herauszufinden, ob eine Entität entfernt wurde, müssten wir wissen, ob sie zuvor verwaltet wurde (z.B. aus der Datenbank stammt, z.B. durch Persistierung oder aus einer find
-Operation erhalten wurde). Hibernate bietet keine "Entitätsstatus-Historie" an, daher gibt es keine zu 100 % zuverlässige Möglichkeit, dies zu tun, aber der folgende Workaround sollte in den meisten Fällen ausreichen:
public boolean isDetached(Entity entity) {
return entity.id != null // darf nicht transient sein
&& !em.contains(entity) // darf derzeit nicht verwaltet sein
&& em.find(Entity.class, entity.id) != null; // darf nicht entfernt worden sein
}
Oben wird angenommen, dass em
der EntityManager
ist, Entity
die Entitätsklasse ist und ein öffentliches id
-Feld besitzt, das ein @GeneratedValue
Primärschlüssel ist. (Es wird auch angenommen, dass die Zeile mit dieser ID nicht durch einen externen Prozess aus der Datenbanktabelle entfernt wurde, nachdem die Entität entfernt wurde.)