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.

1voto

Roger Mori Punkte 11

Um einen ähnlichen Fall zu behandeln, habe ich ein DTO-Objekt erstellt, das das persistente Entitätsobjekt wie folgt erweitert:

class MyEntity
{
   public static class MyEntityDO extends MyEntity {}

}

Schließlich werden mit einer skalaren Abfrage die gewünschten nicht verwalteten Attribute abgerufen:

(Hibernate) select p.id, p.name from MyEntity P
(JPA)       select new MyEntity(p.id, p.name) from myEntity P

1voto

Pradeesh Punkte 21

Ich verwende entityManager.detach(returnObject); was bei mir funktioniert hat.

0voto

Wenn Sie hierher kommen, weil Sie tatsächlich eine Entität über eine entfernte Grenze hinweg übergeben wollen, dann haben Sie einfach etwas Code eingefügt, um den Hibernazi zu täuschen.

for(RssItem i : result.getChannel().getItem()){
}

Cloneable wird nicht funktionieren, weil es tatsächlich kopiert die PersistantBag über.

Und vergessen Sie die Verwendung von serialisierbaren und Bytearray-Streams und Piped Streams. Das Erstellen von Threads zur Vermeidung von Deadlocks tötet das gesamte Konzept.

0voto

Ich denke, es gibt eine Möglichkeit, eine einzelne Entität aus dem EntityManager zu entfernen, indem Sie Folgendes aufrufen

EntityManagerFactory emf;
emf.getCache().evict(Entity);

Dadurch wird eine bestimmte Entität aus dem Cache entfernt.

-1voto

trunikov Punkte 1

Ich denke, Sie können auch die Methode EntityManager.refresh(Object o) verwenden, wenn der Primärschlüssel der Entität nicht geändert wurde. Diese Methode wird den ursprünglichen Zustand der Entität wiederherstellen.

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