2010-09-14 4 views
3

Je cours un test dans une sous-classe de AbstractTransactionalTestNGSpringContextTests, où j'exécute des tests sur un contexte Spring partiel. Chaque test s'exécute dans une transaction, qui est annulée à la fin pour laisser la base de données inchangée. Un test écrit dans la base de données via Hibernate, tandis qu'un autre lit dans la même base de données en utilisant JdbcTemplate, les deux partageant la même source de données.Partage d'une transaction Spring entre Hibernate & JdbcTemplate dans un AbstractTransactionalTestNGSpringContextTests

Je constate que je ne peux pas voir les mises à jour d'hibernate lors de l'interrogation via le JdbcTemplate. Cela a du sens, car chacun est supposé obtenir sa propre connexion du pool de connexions et fonctionne ainsi dans sa propre transaction.

J'ai vu des indications qu'il est possible d'obtenir les deux pour partager une transaction & de connexion, mais ne suis pas clair de la meilleure façon de mettre en place, en particulier avec l'implication de la fabrique de connexions. Tous ces composants sont déclarés comme des haricots de printemps. Quelqu'un peut-il me donner des indications?

Edit:

Eh bien, je suis allé à la peine de lire effectivement certains documents et les HibernateTransactionManager états de classe que cela est sans aucun doute possible: « Ce gestionnaire de transactions est appropriée pour les applications qui utilisent un seul Hibernate SessionFactory pour l'accès aux données transactionnelles, mais il prend également en charge l'accès direct à DataSource dans une transaction (c'est-à-dire un code JDBC simple fonctionnant avec la même DataSource) ... ".

La seule exigence semble être la définition de la propriété de source de données, qui n'est pas requise autrement. Ayant fait cela, cependant, je ne vois toujours pas mes changements partagés avant que la transaction a été validée. Je vais mettre à jour si je le fais fonctionner.

+0

avez-vous déjà résolu cela? –

+0

comme je sais que la transaction JTA peut traverser les connexions tandis que la transaction jdbc ne peut prendre en charge qu'une seule connexion, donc si ce que vous avez dit ne fonctionne pas, vous pouvez vérifier la config du gestionnaire de transactions. – OQJF

Répondre

0

Le bean Spring qui écrit doit vider ses modifications pour que le bean qui lit les voit.

+0

Merci - Je vidais déjà après la sauvegarde (sessionFactory.getCurrentSession(). SaveOrUpdate (instance); sessionFactory.getCurrentSession(). Flush();). Ça ne marche pas. Je suppose que vous pensez que ça devrait marcher, alors? –