package gov.samhsa.consent2share.web.config.di.root;
import org.apache.commons.dbcp2.BasicDataSource;
import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.MigrationVersion;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory", basePackages = { "gov.samhsa.consent2share.domain" })
public class DataAccessConfig {
@Value("${database.driverClassName}")
private String databaseDriverClassName;
@Value("${database.password}")
private String databasePassword;
@Value("${database.url}")
private String databaseUrl;
@Value("${database.username}")
private String databaseUsername;
@Bean
public MigrationVersion baselineVersion() {
MigrationVersion baselineVersion = MigrationVersion.fromVersion("1.0.37");
return baselineVersion;
}
@Bean
public BasicDataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl(databaseUrl);
dataSource.setDriverClassName(databaseDriverClassName);
dataSource.setUsername(databaseUsername);
dataSource.setPassword(databasePassword);
dataSource.setTestOnBorrow(true);
dataSource.setTestOnReturn(true);
dataSource.setTestWhileIdle(true);
dataSource.setTimeBetweenEvictionRunsMillis(1800000);
dataSource.setNumTestsPerEvictionRun(3);
dataSource.setMinEvictableIdleTimeMillis(1800000);
dataSource.setValidationQuery("SELECT 1");
return dataSource;
}
@Bean
@DependsOn("flyway")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setPersistenceUnitName("persistenceUnit");
entityManagerFactory
.setPackagesToScan("gov.samhsa.consent2share.domain");
entityManagerFactory.setDataSource(dataSource());
entityManagerFactory.setJpaVendorAdapter(hibernateJpaVendorAdapter());
java.util.Map<String, Object> jpaPropertyMap = entityManagerFactory
.getJpaPropertyMap();
jpaPropertyMap.put("hibernate.dialect",
"org.hibernate.dialect.MySQL5InnoDBDialect");
jpaPropertyMap.put("hibernate.ejb.naming_strategy",
"org.hibernate.cfg.ImprovedNamingStrategy");
jpaPropertyMap.put("hibernate.connection.charSet", "UTF-8");
entityManagerFactory.setJpaPropertyMap(jpaPropertyMap);
return entityManagerFactory;
}
@Bean(name="flyway",initMethod="migrate")
public Flyway flyway() {
Flyway flyway = new Flyway();
flyway.setBaselineVersion(baselineVersion());
flyway.setBaselineOnMigrate(true);
flyway.setDataSource(dataSource());
return flyway;
}
@Bean
public HibernateJpaVendorAdapter hibernateJpaVendorAdapter() {
HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
return hibernateJpaVendorAdapter;
}
@Bean
public JpaTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory()
.getNativeEntityManagerFactory());
return transactionManager;
}
}