Как предотвратить откат транзакции JPA?

Методы вызваны:
1. Struts Action
2. Метод класса обслуживания (аннотируется @Transactional)
3. Вызов веб-сервиса Xfire

Все, включая Struts (DelegatingActionProxy) и транзакции, настроено с помощью Spring.

Постоянство осуществляется с помощью JPA / Hibernate.

Иногда веб-сервис генерирует непроверенное исключение. Я ловлю это исключение и выбрасываю проверенное исключение. Я не хочу, чтобы транзакция откатывалась, поскольку исключение веб-службы изменяет текущее состояние. Я аннотировал метод следующим образом:

@Transactional(noRollbackFor={XFireRuntimeException.class, Exception.class})
public ActionForward callWS(Order order, ....) throws Exception
  (...)
  OrderResult orderResult = null;

  try {
    orderResult = webService.order(product, user)
  } catch (XFireRuntimeException xfireRuntimeException) {
    order.setFailed(true);
    throw new WebServiceOrderFailed(order);
  } finally {
    persist(order);
  }
}

Я все еще получаю это исключение:

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly

Когда я пытаюсь воспроизвести это с помощью junit, транзакция не помечается для отката, и все еще можно зафиксировать транзакцию.

Как сделать так, чтобы Spring не откатывал транзакцию?

Ответы на вопрос(2)

Ваш ответ на вопрос