2010-09-16 14 views
5

Ho un EJB @Stateless con un'interfaccia @WebService, utilizzando transazioni gestite dal contenitore, ovvero le transazioni vengono automaticamente eseguite dal contenitore dopo che un metodo è stato chiamato se non genera un'eccezione di sistema.Come posso rilevare le eccezioni dal commit delle transazioni gestite del contenitore?

Se provo a EntityManager.persist(...) due oggetti con lo stesso valore per una colonna con un vincolo univoco su di esso, il contenitore invierà un PersistenceException al client su commit al di fuori del mio codice. Come posso rilevare questa eccezione in modo da poter rilanciare la mia eccezione di applicazione?

Devo eseguire manualmente la transazione nei miei metodi per rilevare le eccezioni sul commit? (Ed è il EntityManager.flush() il modo corretto per farlo?) Se è così, qual è il punto di avere transazioni gestite dal contenitore?

risposta

3

Purtroppo non è possibile rilevare eccezioni dall'errore della transazione gestita dal contenitore. Come hai affermato, l'opzione migliore è utilizzare le transazioni gestite da bean. In alternativa, è possibile avvolgere il bean EJ con un bean proxy che implementa la stessa interfaccia. Le transazioni gestite dal contenitore sono appropriate quando il codice non ha bisogno di rispondere a specifici errori di commit.

+2

Grazie per la risposta. L'ho risolto facendo 'EntityManager.flush()' in un intercettore '@ AroundInvoke'. –

+1

Potrebbe funzionare a volte, ma attenzione ai livelli di isolamento. A meno che non si serializzi tutto, è ancora possibile ottenere errori quando il tx commette. –

Problemi correlati