/**
* JPA + MyBatis
*/
@Configuration
@ConfigurationProperties(prefix = "spring.datasource.hikari")
@EnableJpaRepositories(
entityManagerFactoryRef = "jpa" + "EntityManagerFactory",
transactionManagerRef = "jpa" + "TransactionManager",
basePackages = "com.ezserver.domain"
)
@MapperScan(basePackages = "com.ezserver.domain")
public class DataSourceConfig extends HikariConfig {
@Bean
@Primary
public DataSource dataSource() {
return new LazyConnectionDataSourceProxy(new HikariDataSource(this));
}
@Bean(name = "jpa" + "EntityManagerFactory")
@Primary
public EntityManagerFactory entityManagerFactory(@Autowired DataSource dataSource) {
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setDataSource(dataSource);
factory.setPackagesToScan("com.ezserver.domain");
setConfigureEntityManagerFactory(factory);
return factory.getObject();
}
@Bean(name = "jpa" + "TransactionManager")
@Primary
public PlatformTransactionManager transactionManager(@Qualifier("jpa" + "EntityManagerFactory") EntityManagerFactory entityManagerFactory) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory);
return transactionManager;
}
@Bean
@Primary
public SqlSessionFactory sqlSessionFactory(@Autowired DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setVfs(SpringBootVFS.class);
factoryBean.setConfiguration(this.getMybatisConfig());
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
factoryBean.setMapperLocations(resolver.getResources("classpath*:mybatis/*.xml"));
return factoryBean.getObject();
}
@Bean
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Autowired SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
private void setConfigureEntityManagerFactory(LocalContainerEntityManagerFactoryBean factory) {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
factory.setJpaVendorAdapter(vendorAdapter);
Map<String, String> jpaPropertyMap = new HashMap<>();
jpaPropertyMap.put("hibernate.hbm2ddl.auto", "create");
jpaPropertyMap.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
jpaPropertyMap.put("hibernate.show_sql", "true");
jpaPropertyMap.put("hibernate.format_sql", "true");
factory.setJpaPropertyMap(jpaPropertyMap);
factory.afterPropertiesSet();
}
private org.apache.ibatis.session.Configuration getMybatisConfig() {
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setCacheEnabled(true);
configuration.setLazyLoadingEnabled(false);
configuration.setAggressiveLazyLoading(false);
configuration.setMultipleResultSetsEnabled(true);
configuration.setUseColumnLabel(true);
configuration.setAutoMappingBehavior(AutoMappingBehavior.PARTIAL);
configuration.setDefaultExecutorType(ExecutorType.SIMPLE);
configuration.setDefaultStatementTimeout(25000);
configuration.setMapUnderscoreToCamelCase(true);
configuration.setJdbcTypeForNull(JdbcType.NVARCHAR);
configuration.setLazyLoadTriggerMethods(new HashSet<>(Arrays.asList("equals", "clone", "hashCode", "toString")));
configuration.setLogPrefix("[SQL]");
return configuration;
}
}
참조
[Spring] 다중 데이터소스 설정(Multiple Datasource JPA, Mybatis)