2010-09-16 7 views
5

Tengo un @Stateless EJB con una interfaz @WebService, usando transacciones administradas por contenedor, lo que significa que las transacciones son automáticamente confirmadas por el contenedor después de que se ha llamado a un método si no lanza una excepción del sistema.¿Cómo puedo detectar excepciones de la confirmación de transacciones gestionadas en contenedores?

Si trato de EntityManager.persist(...) dos objetos con el mismo valor para una columna con una restricción única en él, el contenedor arrojará un PersistenceException al cliente en la confirmación fuera de mi código. ¿Cómo atrapo esta excepción para que pueda volver a lanzar mi propia excepción de aplicación?

¿Debo comprometer la transacción manualmente en mis métodos para detectar excepciones en la confirmación? (¿Y es EntityManager.flush() la forma correcta de hacerlo?) En caso afirmativo, ¿de qué sirve tener transacciones gestionadas en contenedores?

Respuesta

3

Desafortunadamente no es posible detectar excepciones de fallas de transacciones gestionadas por contenedores. Como dijiste, tu mejor opción es usar transacciones administradas por frijol. Alternativamente, podría envolver su EJB EM con un bean proxy que implemente la misma interfaz. Las transacciones administradas por contenedor son apropiadas cuando su código no necesita responder a fallas de compromiso específicas.

+2

Gracias por responder. Lo resolví haciendo 'EntityManager.flush()' en un interceptor '@ AroundInvoke'. –

+1

Eso podría funcionar a veces, pero tenga cuidado con los niveles de aislamiento. A menos que serialice todo, aún es posible obtener fallas cuando el tx se compromete. –

Cuestiones relacionadas