2012-05-20 6 views
3

Dans notre projet java, nous utilisons ORM avec hibernation et le printemps. J'ai rencontré des problèmes lors de la suppression d'objets persistants. Par exemple, cette méthode d'échantillonnage obtient des entités par ids puis les supprimer:Spring transaction propagation_required issue

@Transactional 
public void remove(List<Long> ids) { 
    SearchTemplate template = new SearchTemplate(); 
    template.addParameter("milestoneId",ids); 
    List <InvoiceQueue> items = this.findByCriteria(template); 
    ... 
    this.delete(items); 
} 

Méthode exécute Ok sans exception, mais ne supprime pas les éléments de la DB. L'ajout de l'annotation suivante à la définition de la méthode @Transactional(propagation = Propagation.REQUIRES_NEW) permet de résoudre le problème. Est-ce que quelqu'un peut expliquer pourquoi cela ne fonctionne pas avec le type de propagation par défaut PROPAGATION_REQUIRED?

Merci d'avance.

détails Environnement:

hibernate.version 3.5.5-finale, spring.version 3.0.5.RELEASE

+6

Il peut y avoir un problème avec la transaction environnante. Si vous utilisez PROPAGATION_REQUIRED, cette méthode utilise la transaction en cours. S'il existe une exception au cours de la transaction en cours après l'exécution de cette méthode, les modifications peuvent être annulées. –

Répondre

2

vraiment juste répéter ce que @PeterBagyinszki a dit dans son commentaire, mais la raison est tout à fait probable que la transaction dans laquelle se produit votre suppression est annulée en raison d'une autre exception levée et toutes les modifications effectuées au cours de la transaction sont annulées. Avec Propagation.REQUIRES_NEW, la suppression est effectuée dans sa propre transaction imbriquée distincte. Le résultat de la transaction imbriquée (validée ou annulée) n'affectera pas la transaction "externe" et vice versa. Vérifiez vos journaux pour voir ce qui provoque la transaction à annuler, notez que même quelque chose comme un simple SELECT -query échouer avec quelque chose comme NoResultException entraînera l'annulation de la transaction, à moins que vous n'indictiez explicitement dans le @Transactional - annotation pour ne pas annuler certaines exceptions.

Questions connexes