package com.syzton.sunread.config; import java.util.Properties; import javax.annotation.Resource; import javax.sql.DataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; 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; import org.springframework.transaction.annotation.EnableTransactionManagement; import com.jolbox.bonecp.BoneCPDataSource; /** * @author Petri Kainulainen */ @Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = {"com.syzton.sunread.todo.repository","com.syzton.sunread.repository"}) public class PersistenceContext { protected static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver"; protected static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password"; protected static final String PROPERTY_NAME_DATABASE_URL = "db.url"; protected static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username"; protected static final String IDLE_CONNECTION_TEST_PERIOD_IN_MINUTES = "bonecp.idle_connection_test_period_in_minutes"; protected static final String PARTITION_COUNT = "bonecp.partition_count"; protected static final String ACQUIRE_INCREMENT = "bonecp.acquire_increment"; protected static final String MAX_CONNECTIONS_PER_PARTITION = "bonecp.max_connections_per_partition"; protected static final String MIN_CONNECTIONS_PER_PARTITION = "bonecp.min_connections_per_partition"; protected static final String STATEMENTS_CACHE_SIZE = "bonecp.statements_cache_size"; protected static final String RELEASE_HELPER_THREADS = "bonecp.release_helper_threads"; private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect"; private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL = "hibernate.format_sql"; private static final String PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO = "hibernate.hbm2ddl.auto"; private static final String PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY = "hibernate.ejb.naming_strategy"; private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql"; private static final String[] PROPERTY_PACKAGES_TO_SCAN = {"com.syzton.sunread.todo.model","com.syzton.sunread.model"}; @Resource private Environment environment; @Bean public DataSource dataSource() { BoneCPDataSource dataSource = new BoneCPDataSource(); dataSource.setDriverClass(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER)); dataSource.setJdbcUrl(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_URL)); dataSource.setUsername(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME)); dataSource.setPassword(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD)); dataSource.setIdleConnectionTestPeriodInMinutes(Long.parseLong(environment.getRequiredProperty(IDLE_CONNECTION_TEST_PERIOD_IN_MINUTES))); dataSource.setPartitionCount(Integer.parseInt(environment.getRequiredProperty(PARTITION_COUNT))); dataSource.setAcquireIncrement(Integer.parseInt(environment.getRequiredProperty(ACQUIRE_INCREMENT))); dataSource.setMaxConnectionsPerPartition(Integer.parseInt(environment.getRequiredProperty(MAX_CONNECTIONS_PER_PARTITION))); dataSource.setMinConnectionsPerPartition(Integer.parseInt(environment.getRequiredProperty(MIN_CONNECTIONS_PER_PARTITION))); dataSource.setStatementsCacheSize(Integer.parseInt(environment.getRequiredProperty(STATEMENTS_CACHE_SIZE))); dataSource.setReleaseHelperThreads(Integer.parseInt(environment.getRequiredProperty(RELEASE_HELPER_THREADS))); return dataSource; } @Bean public JpaTransactionManager transactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); return transactionManager; } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); entityManagerFactoryBean.setDataSource(dataSource()); entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); entityManagerFactoryBean.setPackagesToScan(PROPERTY_PACKAGES_TO_SCAN); Properties jpaProperties = new Properties(); jpaProperties.put(PROPERTY_NAME_HIBERNATE_DIALECT, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT)); jpaProperties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL)); jpaProperties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO)); jpaProperties.put(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY)); jpaProperties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL)); entityManagerFactoryBean.setJpaProperties(jpaProperties); return entityManagerFactoryBean; } }