2010-06-15 3 views
1

Nous avons une transaction conteneur avec Spring et JPA (Hibernate). J'ai besoin de faire une mise à jour sur une table pour "marquer" certaines lignes via des instructions natives. Ensuite, nous insérons des lignes via EntityManager de JPATemplate dans cette table. Après cela, nous avons besoin de calculer les changements dans la table via une instruction native (avec l'union d'Oracle et moins, groupes complexes ...)Comment lire les valeurs modifiées avec une requête native pendant une transaction? (Spring et JPA)

Je vois que les changements des étapes 1 et 2 ne sont pas validés et c'est pourquoi la déclaration de 3 échoue. J'ai déjà essayé avec la propagation de transaction REQUIRES_NEW, EntityManager.flush ... N'a pas fonctionné.

1) update SOMETABLE acolumn = somevalue (native) 
2) persist some values into SOMETABLE (via entity manager) 
3) select values from SOMETABLE 

Y at-il une possibilité de lire les modifications des étapes 1 et 2 à l'étape 3?

Répondre

1

Je suppose que vous utilisez le même DataSource dans le JpaTransactionManager, JdbcTemplate et JpaTemplate et ont permis @Transactional avec ceci:

<tx:annotation-driven /> 

En supposant que ce n'est pas un bug de configuration, ma meilleure estimation est que vous appelez sur la méthode @Transactional à partir d'une méthode dans la même classe?

Dans ce cas, vous avez besoin d'AspectJ pour tisser dans la logique de transaction ou refactoriser le code de sorte que la méthode @Transactional se trouve dans une autre classe que la méthode appelante. (L'option refactor est la plus facile et préférée)

Si cela ne résout pas votre problème, vous devez ajouter les classes appropriées à votre question ainsi que les messages pertinents.

Questions connexes