Wie mache ich mein entity-Objekt verwaltet, so kann ich es entfernen?

Funktioniert das nicht -- ich bekomme immer die IllegalArgumentException geworfen mit dem Hinweis "versuchen Sie die Zusammenführung der getrennt und versuchen die zu entfernen wieder."

@PersistenceContext private EntityManager   em;
@Resource           private UserTransaction utx;
public void delete(EN entity) {
    if (entity == null) return;   //null-safe
    EN target = entity;
    try {
        if (!em.contains(entity)) {
            System.out.println("delete() entity not managed: " + entity);
            utx.begin();
            target = em.merge(entity);
            utx.commit();
            System.out.print("delete() this entity should now be managed: " + em.contains(target));
        }
        utx.begin();
        em.remove(target);
        utx.commit();
    } catch (RollbackException ex) {
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
    } catch (HeuristicMixedException ex) {
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
    } catch (HeuristicRollbackException ex) {
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
    } catch (SecurityException ex) {
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalStateException ex) {
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
    } catch (NotSupportedException ex) {
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
    } catch (SystemException ex) {
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
    }
}

Die Ausgabe von log-zeigt die folgende:

INFO: delete() entity not managed: com.database.SomeTable[ id=2 ]  
INFO: delete() this entity should now be managed: false

In anderen Worten, die merge() nicht wieder eine verwaltete Entität. Kann jeder spot, was ich falsch gemacht habe?

Zweite Frage: gibt es eine Möglichkeit, dies zu tun in einer Transaktion statt zwei?

Dies ist mit EclipseLink innen GlassFish 3.1.

  • Haben Sie versucht dabei die Zusammenführung der Transaktion, anstatt draußen?
InformationsquelleAutor AlanObject | 2011-09-16
Schreibe einen Kommentar