Comment prévenir la JPA de restauration transaction?

Méthodes invoquées sont les suivantes:
1. Struts Action
2. Classe de Service (méthode annotée par @Transactionnelle)
3. Xfire webservice appel

Tout, y compris les entretoises (DelegatingActionProxy) et des opérations est configuré avec le Printemps.

La persistance est fait avec JPA/Hibernate.

Parfois le webservice va jeter un décoché exception. Je attraper cette exception et de jeter un checked exception. Je ne veux pas la transaction, afin de faire reculer depuis le service web exception des changements de l'état actuel. J'ai annoté de la méthode comme ceci:

@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);
  }
}

J'obtiens toujours cette exception:

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

Quand j'ai essayer de reproduire cela avec junit, la transaction n'est pas marqué pour la faire reculer et il est toujours possible de valider la transaction.

Comment puis-je faire le Printemps à ne pas annuler la transaction?

OriginalL'auteur D. Wroblewski | 2009-11-09