Tenemos una aplicación Java ejecutándose en JBoss 5.1 y en algunos casos necesitamos evitar que una transacción se cierre en caso de que un método subyacente arroje un JDBCException
.Evitar la reversión de transacción en JBoss + Hibernate
Tenemos un método EJB que se parece a la siguiente
@PersistenceContext(unitName = "bar")
public EntityManager em;
public Object foo() {
try {
insert(stuff);
return stuff;
} (catch PersistenceException p) {
Object t = load(id);
if (t != null) {
find(t);
return t;
}
}
}
Si insert
falla debido a un PersistenceException
(que se ajusta un JDBCException
causado por una violación de restricción), queremos continuar la ejecución con load
dentro del misma transacción.
No podemos hacerlo ahora porque el contenedor cierra la transacción. Esto es lo que vemos en los registros:
claseorg.hibernate.exception.GenericJDBCException: Cannot open connection
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614)
...
Caused by: javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: 7f000101:85fe:4f04679d:182 status: ActionStatus.ABORT_ONLY >
El EJB está marcado con las siguientes anotaciones
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
¿Hay alguna forma adecuada para prevenir la transacción ruede hacia atrás en tan sólo este caso concreto?