2010-09-16 2 views
5

Ich habe eine @Stateless EJB mit einer @WebService Schnittstelle, die Container-verwaltete Transaktionen verwendet, was bedeutet, dass Transaktionen automatisch vom Container festgelegt werden, nachdem eine Methode aufgerufen wurde, wenn keine Systemausnahme ausgelöst wird.Wie erfahre ich Ausnahmen von Container Managed Transaction Commit?

Wenn ich versuche, zwei Objekte mit dem gleichen Wert für eine Spalte mit einer eindeutigen Integritätsbedingung EntityManager.persist(...), wird der Container eine PersistenceException an den Client bei Commit außerhalb meines Codes zu werfen. Wie kann ich diese Ausnahme abfangen, damit ich meine eigene Anwendungsausnahme erneut ausführen kann?

Muss ich die Transaktion in meinen Methoden manuell festschreiben, um Ausnahmen beim Commit abzufangen? (Und ist EntityManager.flush() der richtige Weg, um das zu tun?) Wenn ja, was ist der Sinn von Container-Managed-Transaktionen?

Antwort

3

Es ist leider nicht möglich, Ausnahmen von einem vom Container verwalteten Transaktionsfehler abzufangen. Wie Sie angegeben haben, ist die beste Option, Bean-gesteuerte Transaktionen zu verwenden. Alternativ können Sie Ihren EM EJB mit einer Proxy-Bean umhüllen, die dieselbe Schnittstelle implementiert. Containerverwaltete Transaktionen sind geeignet, wenn Ihr Code nicht auf bestimmte Commit-Fehler reagieren muss.

+2

Vielen Dank für Ihre Antwort. Ich habe es gelöst, indem ich 'EntityManager.flush()' in einem '@ AroundInvoke' Interceptor gemacht habe. –

+1

Das könnte manchmal funktionieren, aber sei vorsichtig mit Isolationsstufen. Wenn Sie nicht alles serialisieren, ist es immer noch möglich, Fehler zu erhalten, wenn der TX-Code festgeschrieben wird. –