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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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?