У нас есть Java-приложение, работающее на JBoss 5.1, и в некоторых случаях нам нужно предотвратить закрытие транзакции, если JDBCException
будет выброшен каким-либо базовым методом.
У нас есть метод EJB, который выглядит следующим образом
@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;
}
}
}
Если insert
не работает из-за PersistenceException
(который оборачивает JDBCException
, вызванный нарушением ограничений), мы хотим продолжить выполнение с load
в той же транзакции.
Сейчас мы не можем этого сделать, потому что транзакция закрыта контейнером. Вот что мы видим в логах:
org.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 >
Класс EJB помечен следующими аннотациями
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
Есть ли какой-нибудь правильный способ предотвратить откат транзакции только в этом конкретном случае?