¿Cómo evitar que JPA restablezca la transacción?

Métodos invocados:
1. Struts Acción
2. Método de clase de servicio (anotado por @Transactional)
3. Llamada al servicio web Xfire

Todo lo que incluye struts (DelegatingActionProxy) y transacciones se configura con Spring.

La persistencia se hace con JPA / Hibernate.

A veces, el servicio web lanzará una excepción no verificada. Capto esta excepción y lanzo una excepción marcada. No quiero que la transacción se revierta, ya que la excepción del servicio web cambia el estado actual. He anotado el método así:

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

Todavía tengo esta excepción:

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

Cuando intento reproducir esto con Junit, la transacción no está marcada para retrotracción y todavía es posible confirmar la transacción.

¿Cómo hago que Spring no retrase la transacción?

Respuestas a la pregunta(2)

Su respuesta a la pregunta