Is it possible to use Spring Data JPA (backed by Hibernate as JPA provider) and directly use Hibernate at the same time?
The problem is that when i use JpaTransactionMan
This is what I did, and it worked well:
one data source, two transaction manager.
Data source bean:
For Hibernate XML based configuration:
And for spring-data-jpa java based configuration:
@Configuration
@EnableJpaRepositories(basePackages = {"org.sharder.core.repository"},
transactionManagerRef = "jpaTransactionManager")
@EnableTransactionManagement
public class JpaConfig {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(ComboPooledDataSource comboPooledDataSource) {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
vendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQLDialect");
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("org.sharder.core.entity");
factory.setDataSource(comboPooledDataSource);
factory.setJpaProperties(getHibernateProperties());
return factory;
}
@Bean(name = "jpaTransactionManager")
public PlatformTransactionManager jpaTransactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
private Properties getHibernateProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
properties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory");
properties.setProperty("hibernate.cache.use_query_cache", "true");
properties.setProperty("hibernate.cache.use_second_level_cache", "true");
properties.setProperty("hibernate.cache.use_structured_entries", "true");
properties.setProperty("hibernate.format_sql", "true");
properties.setProperty("hibernate.show_sql", "true");
properties.setProperty("hibernate.use_sql_comments", "true");
properties.setProperty("hibernate.query.substitutions", "true 1, false 0");
properties.setProperty("hibernate.jdbc.fetch_size", "20");
properties.setProperty("hibernate.connection.autocommit", "false");
properties.setProperty("hibernate.connection.release_mode", "auto");
return properties;
}
}
Notice that, transactionManagerRef = "jpaTransactionManager" set the JpaTransactionManager to be used with the repositories.
Spring Data JPA namespace attributes