Bonjour,
Je souhaite annuler (rollback) une transaction dans la callback @PostPersist d'une entité. Mon but est de vérifier des paramètres et, si ils ne sont pas bon, d'annuler la transaction pour que l'objet en question ne soit pas enregistré.
J'ai lu sur un site l'information suivante :
If a callback method throws an exception within an active transaction, the transaction is marked for rollback and no more callback methods are invoked for that operation.
Cependant lorsque je lance une exception dans ma méthode j'obtiens l'erreur suivante:
1 2 3 4 5 6 7 8 9 10
| ....
Caused by: javax.transaction.RollbackException: Transaction marked for rollback.
at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:473)
at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:852)
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5114)
... 37 more
Caused by: java.lang.ClassCastException: java.lang.Exception cannot be cast to java.lang.Error
at org.eclipse.persistence.internal.jpa.metadata.listeners.EntityListener.invokeMethod(EntityListener.java:257)
at org.eclipse.persistence.internal.jpa.metadata.listeners.EntityClassListener.invokeMethod(EntityClassListener.java:75)
at org.eclipse.persistence.internal.jpa.metadata.listeners.EntityListener.postInsert(EntityListener.java:344) |
La transaction est bien annulée mais par l'exception :
Caused by: java.lang.ClassCastException: java.lang.Exception cannot be cast to java.lang.Error
et pas par mon exception à moi.
Pour l'instant mon code se limite à :
1 2 3 4
| @PostPersist
private void test() throws Exception {
throw new Exception("test");
} |
Comment faut-il faire pour annuler proprement une transaction dans une callback?
Partager