package sample;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.*;
import org.springframework.orm.jpa.*;
import sample.context.orm.*;
import sample.context.orm.DefaultRepository.DefaultDataSourceProperties;
import sample.context.orm.SystemRepository.SystemDataSourceProperties;
/**
* アプリケーションのデータベース接続定義を表現します。
*/
@Configuration
@EnableConfigurationProperties({DefaultDataSourceProperties.class, SystemDataSourceProperties.class })
public class ApplicationDbConfig {
/** 永続化時にメタ情報の差込を行うインターセプタ */
@Bean
OrmInterceptor ormInterceptor() {
return new OrmInterceptor();
}
/** 標準スキーマへの接続定義を表現します。 */
@Configuration
static class DefaultDbConfig {
@Bean
DefaultRepository defaultRepository() {
return new DefaultRepository();
}
@Bean(name = DefaultRepository.BeanNameDs, destroyMethod = "close")
@Primary
DataSource dataSource(DefaultDataSourceProperties props) {
return props.dataSource();
}
@Bean(name = DefaultRepository.BeanNameEmf)
@Primary
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(
DefaultDataSourceProperties props,
@Qualifier(DefaultRepository.BeanNameDs) final DataSource dataSource) {
return props.entityManagerFactoryBean(dataSource);
}
@Bean(name = DefaultRepository.BeanNameTx)
@Primary
JpaTransactionManager transactionManager(
DefaultDataSourceProperties props,
@Qualifier(DefaultRepository.BeanNameEmf) final EntityManagerFactory emf) {
return props.transactionManager(emf);
}
}
/** システムスキーマへの接続定義を表現します。 */
@Configuration
static class SystemDbConfig {
@Bean
SystemRepository systemRepository() {
return new SystemRepository();
}
@Bean(name = SystemRepository.BeanNameDs, destroyMethod = "close")
DataSource systemDataSource(SystemDataSourceProperties props) {
return props.dataSource();
}
@Bean(name = SystemRepository.BeanNameEmf)
LocalContainerEntityManagerFactoryBean systemEntityManagerFactoryBean(
SystemDataSourceProperties props,
@Qualifier(SystemRepository.BeanNameDs) final DataSource dataSource) {
return props.entityManagerFactoryBean(dataSource);
}
@Bean(name = SystemRepository.BeanNameTx)
JpaTransactionManager systemTransactionManager(
SystemDataSourceProperties props,
@Qualifier(SystemRepository.BeanNameEmf) final EntityManagerFactory emf) {
return props.transactionManager(emf);
}
}
}