package io.hypersistence.optimizer.jpa; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import io.hypersistence.optimizer.HypersistenceOptimizer; import io.hypersistence.optimizer.core.config.JpaConfig; import io.hypersistence.optimizer.hibernate.decorator.HypersistenceHibernatePersistenceProvider; import org.hibernate.ejb.HibernatePersistence; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.*; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.JpaVendorAdapter; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.support.TransactionTemplate; import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import java.util.Properties; /** * * @author Vlad Mihalcea */ @Configuration @PropertySource({"/META-INF/application.properties"}) @ComponentScan(basePackages = "io.hypersistence.optimizer.forum") @EnableTransactionManagement @EnableAspectJAutoProxy public class JpaTransactionManagerConfiguration { @Value("${jdbc.dataSourceClassName}") private String dataSourceClassName; @Value("${jdbc.url}") private String jdbcUrl; @Value("${jdbc.username}") private String jdbcUser; @Value("${jdbc.password}") private String jdbcPassword; @Value("${hibernate.dialect}") private String hibernateDialect; @Bean(destroyMethod = "close") public DataSource actualDataSource() { Properties driverProperties = new Properties(); driverProperties.setProperty("url", jdbcUrl); driverProperties.setProperty("user", jdbcUser); driverProperties.setProperty("password", jdbcPassword); Properties properties = new Properties(); properties.put("dataSourceClassName", dataSourceClassName); properties.put("dataSourceProperties", driverProperties); properties.setProperty("maximumPoolSize", String.valueOf(3)); return new HikariDataSource(new HikariConfig(properties)); } @Bean public static PropertySourcesPlaceholderConfigurer properties() { return new PropertySourcesPlaceholderConfigurer(); } @Bean public DataSource dataSource() { return actualDataSource(); } @Bean public EntityManagerFactory entityManagerFactory() { LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); entityManagerFactoryBean.setPersistenceUnitName(persistenceUnitName()); entityManagerFactoryBean.setPersistenceProvider(new HibernatePersistence()); entityManagerFactoryBean.setDataSource(dataSource()); entityManagerFactoryBean.setPackagesToScan(packagesToScan()); JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter); entityManagerFactoryBean.setJpaProperties(additionalProperties()); entityManagerFactoryBean.afterPropertiesSet(); return HypersistenceHibernatePersistenceProvider.decorate( entityManagerFactoryBean.getNativeEntityManagerFactory() ); } @Bean public HypersistenceOptimizer hypersistenceOptimizer( EntityManagerFactory entityManagerFactory) { return new HypersistenceOptimizer( new JpaConfig( entityManagerFactory ) ); } @Bean public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory){ JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactory); return transactionManager; } @Bean public TransactionTemplate transactionTemplate(EntityManagerFactory entityManagerFactory) { return new TransactionTemplate(transactionManager(entityManagerFactory)); } protected Properties additionalProperties() { Properties properties = new Properties(); properties.setProperty("hibernate.dialect", hibernateDialect); properties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); return properties; } protected String[] packagesToScan() { return new String[]{ "io.hypersistence.optimizer.forum.domain" }; } private String persistenceUnitName() { return getClass().getSimpleName(); } }