Предотвращение отката транзакции в JBoss + Hibernate

У нас есть 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)

Есть ли какой-нибудь правильный способ предотвратить откат транзакции только в этом конкретном случае?

7
задан abahgat 4 January 2012 в 16:52
поделиться