60 Stimmen

Lösen einer Entität aus dem JPA/EJB3-Persistenzkontext

Was wäre der einfachste Weg, eine bestimmte JPA Entity Bean, die über einen EntityManager erworben wurde, zu lösen. Alternativ könnte ich eine Abfrage zurückgeben losgelöst Objekte in den ersten Platz, so dass sie im Wesentlichen als "nur lesen" handeln würde?

Der Grund, warum ich dies tun möchte, ist, weil ich die Daten innerhalb der Bohne ändern möchte - mit in meiner Anwendung nur, aber nicht immer haben es in die Datenbank persistiert. In meinem Programm muss ich schließlich flush() auf dem EntityManager aufrufen, was alle Änderungen von angehängten Entitäten in der Datenbank persistieren würde, aber ich möchte bestimmte Objekte ausschließen.

62voto

(für eine Antwort ist es vielleicht zu spät, kann aber für andere nützlich sein)

Ich bin gerade dabei, mein erstes System mit JPA zu entwickeln. Leider bin ich mit diesem Problem konfrontiert, wenn dieses System fast fertig ist.

Einfach ausgedrückt. Verwenden Sie Hibernate, oder warten Sie auf JPA 2.0.

In Hibernate können Sie "session.evict(object)" verwenden, um ein Objekt aus der Sitzung zu entfernen. In JPA 2.0, zur Zeit im Entwurf , Es gibt die Methode "EntityManager.detach(object)", um ein Objekt aus dem Persistenzkontext zu lösen.

29voto

Mehdi Punkte 4368

Unabhängig davon, welche JPA-Implementierung Sie verwenden, verwenden Sie einfach entityManager.detach(object) es ist jetzt in JPA 2.0 und Teil von JEE6.

19voto

James McMahon Punkte 46733

Wenn Sie ein Objekt vom EntityManager lösen müssen und Hibernate als zugrunde liegende ORM-Schicht verwenden, können Sie auf die Hibernate-Sitzung Objekts und verwenden das Session.evict(Object) Methode, die Mauricio Kanada oben erwähnt hat.

public void detach(Object entity) {
    org.hibernate.Session session = (Session) entityManager.getDelegate();
    session.evict(entity);
}

Natürlich würde das nicht funktionieren, wenn man zu einem anderen ORM-Anbieter wechselt, aber ich denke, das ist besser, als zu versuchen, eine tiefe Kopie zu erstellen.

17voto

Andrei Punkte 764

Leider gibt es in der aktuellen JPA-Implementierung (AFAIR) keine Möglichkeit, ein Objekt vom Entitätsmanager zu trennen.

EntityManager.clear() wird die Verbindung trennen alle die JPA-Objekte, so dass dies möglicherweise nicht in allen Fällen eine geeignete Lösung ist, wenn Sie andere Objekte haben, die Sie verbunden lassen möchten.

Am besten wäre es also, die Objekte zu klonen und die Klone an den Code zu übergeben, der die Objekte ändert. Da primitive und unveränderliche Objektfelder vom Standard-Klon-Mechanismus ordnungsgemäß verwaltet werden, müssen Sie nicht viel Klempner-Code schreiben (abgesehen vom tiefen Klonen aller aggregierten Strukturen, die Sie möglicherweise haben).

3voto

James Punkte 18499

Bei Verwendung von EclipseLink haben Sie auch die Möglichkeit,

Verwenden Sie den Abfrage-Hinweis, eclipselink.maintain-cache"="false - werden alle zurückgegebenen Objekte abgetrennt.

Verwenden Sie die EclipseLink JpaEntityManager copy() API, um das Objekt in die gewünschte Tiefe zu kopieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X