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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach Begehung der Persistenz-Kontext sollte Weg sein. So Ihr println test nach dem commit fehl, da das "Ziel" Objekt ist nicht gelungen, mehr.
Tun, alle Ihre Sachen in eine Transaktion ein und es sollte funktionieren. Sie müssen nur starten Sie Ihre Transaktion nach Ihrem "Versuch" beginnt.
Diesem code-snippet erstellt zwei Transaktionen:
Während es wahr ist, dass das Unternehmen fusionierte in den Persistenz-Kontext, es gilt nur für die erste Transaktion, und nicht für beide. In der zweiten Transaktion wird der persistenzkontext im Zusammenhang mit der Transaktion wird sich wieder finden, der ein freistehendes Objekt als argument übergeben, in der folgenden Zeile:
da, die vorherigen
utx.commit()
würde losgelöst haben den Verweis auftarget
.Dieses Problem zu beheben, müssen Sie verschmelzen die Entität in den persistenzkontext, und löschen Sie die Entität in der gleichen Transaktion, bevor der Referenz getrennt: