2009-05-20 6 views
1

Je possède ce code:Comment puis-je couper une transaction au printemps avec JPA?

run big query: Select all unprocessed objects from table A 
for each result 
    create or update an output object in table B 
    update input object: Set it to "processed" 

Je voudrais avoir une transaction sur le corps de la boucle, qui est au bout d'une rangée d'entrée est traitée, les objets mis à jour devraient être engagés, alors quand le programme avorte, il ne traitera plus toutes les lignes mais commencera par la ligne défectueuse. J'utilise Spring 2.5, Hibernate 3.4 et JPA (c'est-à-dire que j'ai un EntityManager).

Comment faire cela? J'ai essayé d'appeler em.getTransaction().commit() dans la boucle mais Spring ne le permettra pas.

Répondre

0

Sans regarder les documents de printemps et ne pas connaître la configuration de votre transaction:

Vous devez d'abord configurer un gestionnaire de transactions (probablement HibernateTransactionManager). Ensuite, à mon humble avis, il est préférable d'utiliser TransactionTemplate de Spring pour exécuter chaque itération à l'intérieur de sa propre transaction. Vous devez vous assurer que TransactionTemplate démarre réellement une nouvelle transaction ou qu'aucune transaction n'est en cours lors de l'entrée de la méthode. Un conseil: utilisez le nom de la classe du gestionnaire de transactions comme catégorie de journal pour le comportement de la transaction de débogage.

1

Les opérations de lecture du gestionnaire d'entités ne nécessitent pas de transaction. Donc j'essaierais de refactoriser une méthode interne pour mettre à jour la ligne et la mettre sur transactionnelle. Notez qu'il faudra utiliser une méthode publique pour utiliser @transactional.

2

Je vous recommande de regarder le TransactionTemplate du printemps. Le TransactionTemplate documentation contient des exemples qui répondent exactement à ce que vous essayez d'atteindre.

Questions connexes