it-swarm.com.de

java.lang.IllegalArgumentException: Entfernen einer separaten Instanz com.test.User # 5

Ich habe ein Java EE-Projekt mit JPA (transaction-type = "JTA"), als Provider in den Ruhezustand versetzt. Ich schreibe meine Bohnen, um mit den CRUD-Dingen fertig zu werden. Das Programm läuft in JBOSS 7 AS.

Ich habe einen EntityManagerDAO:

@Stateful
public class EntityManagerDao implements Serializable {

    @PersistenceContext(unitName = "dtdJpa")
    private EntityManager entityManager;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public Object updateObject(Object object) {
        object = entityManager.merge(object);
        return object;
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void createObject(Object object) {
        entityManager.persist(object);
    }

    public void refresh(Object object) {
        entityManager.refresh(object);
    }

    public <T> T find(Class<T> clazz, Long id) {
        return entityManager.find(clazz, id);
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void deleteObject(Object object) {
        entityManager.remove(object);
    }
}

wenn ich jedoch deleteObject aufrufe, kommt diese Ausnahme heraus.

Java.lang.IllegalArgumentException: Entfernen einer separaten Instanz com.test.User # 5

Wie wird das verursacht und wie kann ich es lösen?

43
neptune

EntityManager#remove() funktioniert nur für Entitäten, die in der aktuellen Transaktion/dem aktuellen Kontext verwaltet werden. In Ihrem Fall rufen Sie die Entität in einer früheren Transaktion ab, speichern sie in der HTTP-Sitzung und versuchen, sie in einer anderen Transaktion/einem anderen Kontext zu entfernen. Das funktioniert einfach nicht.

Sie müssen überprüfen, ob die Entität von EntityManager#contains() verwaltet wird, und wenn nicht, dann lassen Sie sie EntityManager#merge() verwalten.

Grundsätzlich sollte die delete()-Methode Ihrer Business-Service-Klasse folgendermaßen aussehen:

em.remove(em.contains(entity) ? entity : em.merge(entity));
177
BalusC

In meinem Fall habe ich den gleichen Fehler erhalten, als ich versuchte, ein Objekt zu löschen. 

session.delete(obj)

ohne vorher eine Transaktion zu erstellen.

Das Problem wird gelöst, indem zuerst die Transaktion erstellt wird (session.beginTransaction ()) und dann das Objekt gelöscht wird.

Ich hoffe meine Antwort wird jemandem helfen :)

3
Rajesh

Manchmal liegt es einfach daran, dass Sie die Annotation @Transaction für das Hinzufügen, Entfernen und Aktualisieren von Vorgängen fehlen.

0
Lingying Zhang

Ich hatte das gleiche Problem. Das freistehende Unternehmen sollte erneut verbunden werden. Wie bei @BalusC erwähnt, sollte die getrennte Entität mit EntityManager.merge() verbunden werden. EntityManager.merge() generiert eine SQL-Abfrage, die den aktuellen Status der Entität abruft, für die EntityManager.remove() ausgeführt werden muss. Aber in meinem Fall hat es nicht funktioniert. Versuchen Sie es stattdessen mit EntityManager.remove(EntityManager.find(Class<T>,arg)). Es hat für mich funktioniert.

0
murali101002

Wenn ich aus meiner Erfahrung ein Objekt von der Datenbank abfrage und dann den Entitätsmanager schloss und dann eine Datenbank lösche, tritt das Problem auf. Oder wenn ich das geladene Objekt in eine andere Instanz kopiere und dann lösche, tritt auch dieses Problem auf ... Meiner Meinung nach gibt es zwei Dinge, die zu beachten sind:

  • Das Objekt muss sich in derselben Sitzung befinden, die vom Entity Manager erstellt wurde
  • Das Objekt darf nicht auf ein anderes Objekt übertragen werden, während die Entity Manager-Sitzung noch geöffnet ist.

Prost

0
Artanis Zeratul