diff --git a/dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/config/HibernateConfig.java b/dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/config/HibernateConfig.java index a77f5fa400c8..113868df4acc 100644 --- a/dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/config/HibernateConfig.java +++ b/dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/config/HibernateConfig.java @@ -84,8 +84,16 @@ public static PersistenceExceptionTranslationPostProcessor exceptionTranslation( } @Bean - public JpaTransactionManager jpaTransactionManager(EntityManagerFactory entityManagerFactory) { - return new JpaTransactionManager(entityManagerFactory); + public JpaTransactionManager jpaTransactionManager( + EntityManagerFactory entityManagerFactory, + @Qualifier("actualDataSource") DataSource dataSource) { + JpaTransactionManager transactionManager = new JpaTransactionManager(entityManagerFactory); + // Must be the same bean instance the JdbcTemplates get. Spring keys transactional connections + // by DataSource identity, so without this a @Transactional method mixing Hibernate and + // JdbcTemplate takes a second connection which is not enlisted in the transaction: its + // statements commit immediately and a rollback does not cover them. + transactionManager.setDataSource(dataSource); + return transactionManager; } @Bean