Pour certaines raisons, j'ai effectué manuellement la validation et la restauration des transactions à l'aide de Spring PlatformTransactionManager, ce que je dois faire est de configurer un hook afin qu'une action de post-validation ait lieu après la validation de la transaction.
En regardant:
void commit(TransactionStatus status) throws TransactionException;
Je ne peux pas voir comment je peux déterminer qu'une transaction a réussi, à part la supposer, donc si aucune exception n'est levée.
Et je pourrais utiliser AOP comme une option, mais qu'en est-il de le faire par programmation, peut-être en utilisant la méthode de rappel?
Vous pouvez obtenir exactement ce que vous voulez d'une manière plus simple, avec TransactionSynchronizationManager
et TransactionSynchronization
Avec TransactionSynchronizationManager
, vous disposez de méthodes statiques pour obtenir des informations sur la transaction en cours et vous pouvez enregistrer un TransactionSynchronization
qui vous permet d'effectuer automatiquement une post-validation lorsque vous l'appelez
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){
void afterCommit(){
//do what you want to do after commit
}
})
Sachez que TransactionSynchronization se fait sur une base par thread (ce qui n'est souvent pas un problème pour une demande Web de base).
Mention à la réponse de Grooveek et au commentaire d'Alex en dessous - Je mets cela ici parce que les suggestions combinées fournissent une solution solide et plus propre qui est difficile à trouver sur le net.
Utilisation de Spring 4+. si vous avez besoin d'un rappel sur un @Transactional
méthode après sa validation réussie, il suffit d'ajouter qu'au début de la méthode:
@Service
public class OneService {
@Autowired
OneDao dao;
@Transactional
public void a transactionalMethod() {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){
public void afterCommit(){
//do stuff right after commit
System.out.println("commit!!!");
}
});
//do db stuff
dao.save();
}
}
Dans l'un de mes projets, pour certaines raisons, j'ai également dû utiliser PlatformTransactionManager
. J'ai donc forcé à utiliser org.springframework.transaction.support.TransactionTemplate
.
Le principal avantage est que si vous avez correctement implémenté PlatformTransactionManager, vous n'avez pas à vous soucier de la validation/restauration manuelle. Au moins le code source de TransactionTemplate peut vous aider si vous avez besoin d'une chose plus spécifique.
C'est assez simple à utiliser:
config.xml
<bean name="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="platformTransactionManager"/>
</bean>
MyServiceImpl.Java
@ Service Classe publique MyServiceImpl implémente MyService { @Autowired Private TransactionTemplate transactionTemplate; entité publique getSomethingWithTx (identifiant long final) { return transactionTemplate.execute (new TransactionCallback <Entity> () { @Override Entité publique doInTransaction (état TransactionStatus) { // TODO implémente } }); }