package pl.edu.icm.saos.persistence;
import java.sql.SQLException;
import java.util.Properties;
import javax.persistence.EntityManagerFactory;
import javax.persistence.SharedCacheMode;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.hibernate4.HibernateExceptionTranslator;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import pl.edu.icm.saos.persistence.common.DefaultIsolationLevelJpaDialect;
/**
* @author Ćukasz Dumiszewski
*/
@Configuration
@ComponentScan
@EnableJpaRepositories(repositoryImplementationPostfix="CustomImpl")
@EnableTransactionManagement
public class PersistenceConfiguration {
private static Logger log = LoggerFactory.getLogger(PersistenceConfiguration.class);
@Autowired
private Environment env;
@Bean
public DataSource dataSource() {
log.info("== DATASOURCE URL: " + env.getProperty("datasource.url") + " == ");
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(env.getProperty("datasource.driverClassName"));
dataSource.setUrl(env.getProperty("datasource.url"));
dataSource.setUsername(env.getProperty("datasource.username"));
dataSource.setPassword(env.getProperty("datasource.password"));
return dataSource;
}
@Bean
public EntityManagerFactory entityManagerFactory() {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setDataSource(dataSource());
emf.setPackagesToScan(new String[] {"pl.edu.icm.saos.persistence"});
emf.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
emf.setJpaVendorAdapter(vendorAdapter);
emf.setJpaProperties(hibernateProperties());
emf.afterPropertiesSet();
emf.setJpaDialect(new DefaultIsolationLevelJpaDialect());
return emf.getObject();
}
public Properties hibernateProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
properties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
properties.setProperty("hibernate.format_sql", "true");
properties.setProperty("hibernate.generate_statistics", env.getProperty("hibernate.generate_statistics"));
properties.setProperty("hibernate.cache.use_second_level_cache", "true");
properties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.SingletonEhCacheRegionFactory");
properties.setProperty("net.sf.ehcache.configurationResourceName", env.getProperty("net.sf.ehcache.configurationResourceName"));
properties.setProperty("hibernate.ejb.naming_strategy", "pl.edu.icm.saos.persistence.common.CustomDbNamingStrategy");
properties.setProperty("jadira.usertype.autoRegisterUserTypes", env.getProperty("jadira.usertype.autoRegisterUserTypes"));
properties.setProperty("jadira.usertype.databaseZone", env.getProperty("jadira.usertype.databaseZone"));
properties.setProperty("jadira.usertype.javaZone", env.getProperty("jadira.usertype.javaZone"));
properties.setProperty("hibernate.ejb.event.merge", "pl.edu.icm.saos.persistence.common.GeneratedMergeEventListener");
properties.setProperty("hibernate.ejb.event.create", "pl.edu.icm.saos.persistence.common.GeneratedPersistEventListener");
return properties;
}
@Bean
public PlatformTransactionManager transactionManager() throws SQLException {
JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory());
return txManager;
}
@Bean
public HibernateExceptionTranslator hibernateExceptionTranslator() {
return new HibernateExceptionTranslator();
}
@Bean
public PersistenceExceptionTranslationPostProcessor exTranslationPostProcessor() {
return new PersistenceExceptionTranslationPostProcessor();
}
/*@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory);
return txManager;
}*/
}