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
NamesService namesServiceKaumei(JdbcConnectionProvider provider) {
return new NamesServiceKaumeiJdbc(provider);
}

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