Skip to content

Spring Hibernate

Use this integration when Spring manages transactions through HibernateTransactionManager. Flush the current Hibernate session before running native SQL to ensure pending changes reach the database. DataSourceUtils.getConnection then returns the transaction-bound connection from the configured DataSource.

Wrap the flush + connection retrieval inside a JdbcConnectionProvider bean:

HibernateConnectionProvider.java
public class HibernateConnectionProvider implements JdbcConnectionProvider {
private final SessionFactory sessionFactory;
private final DataSource dataSource;
public HibernateConnectionProvider(SessionFactory sessionFactory, DataSource dataSource) {
this.sessionFactory = requireNonNull(sessionFactory);
this.dataSource = requireNonNull(dataSource);
}
@Override
public Connection getConnection() {
sessionFactory.getCurrentSession().flush();
return DataSourceUtils.getConnection(dataSource);
}
}

Inject the provider into your generated classes through the Spring configuration:

SpringHibernateConfig.java
@Bean
PlatformTransactionManager transactionManager(SessionFactory sessionFactory) {
return new HibernateTransactionManager(sessionFactory);
}
@Bean
JdbcConnectionProvider hibernateConnectionProvider(
SessionFactory sessionFactory,
DataSource dataSource) {
return new HibernateConnectionProvider(sessionFactory, dataSource);
}
@Bean
TradeRepository tradeRepositoryKaumei(JdbcConnectionProvider provider) {
return new TradeRepositoryKaumei$Jdbc(provider);
}

The example combines native Hibernate access and Kaumei JDBC in both directions inside one @Transactional service method. Its duplicate-UTI rollback verifies that both access paths participate in the same Spring-managed transaction.

This approach has not been tested outside Spring. Frameworks that expose a managed Hibernate session should provide a similar provider.