タイトル: 複数のDBに接続する設定(Spring Boot & JPA編)
SEOタイトル: 【Spring Boot (JPA編)】複数のDBに接続する設定
前提
・Spring Boot
・JPA
プロパティファイルの定義
application.propertiesに複数のDBを定義する。
spring.datasource.db1.driverClassName= ...
spring.datasource.db1.url= ...
spring.datasource.db1.username= ...
spring.datasource.db1.password= ...
spring.datasource.db2.driverClassName= ...
spring.datasource.db2.url= ...
spring.datasource.db2.username= ...
spring.datasource.db2.password= ...
|
エンティティの作成
使用するDBによりエンティティのパッケージを分ける。
DBの数だけパッケージを作成して対象のエンティティも定義する。
package ....entity.db1;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Entity
@Table(name="TABLE1")
public class Table1 {
@Column
private String col1;
...
}
|
リポジトリの作成
リポジトリもエンティティと同様にDBによりパッケージを分割する。
DBの数だけパッケージを作成して対象のリポジトリも定義する。
package ....repository.db1;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import ....entity.db1.Test1;
@Repository
public interface Table1RepositoryDb1 extends JpaRepository<Test1, String>{
}
|
DBの向き先定義
使用するパッケージ名により使用するDBを変更する定義を記載する。(パッケージ名により対象の接続先、エンティティ、リポジトリを分岐させる)
以下のファイルをDBの数だけ作成する。
尚、@Primaryを付与しないとビルドが失敗するのでどれか1つのファイルにだけ定義しておくこと。(2つ目以降の定義ファイルには不要)
package ....db;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
@Configuration
@EnableJpaRepositories(
basePackages = "...repository.db1",
entityManagerFactoryRef = "db1EntityManager",
transactionManagerRef = "db1TransactionManager"
)
public class Db1DataSourceConfiguration {
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource.db1")
public DataSourceProperties db1Properties() {
return new DataSourceProperties();
}
@Bean
@Primary
@Autowired
public DataSource db1DataSource(@Qualifier("db1Properties")
DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
@Bean
@Primary
@Autowired
public LocalContainerEntityManagerFactoryBean db1EntityManager(EntityManagerFactoryBuilder builder,@Qualifier("db1DataSource") DataSource dataSource){
return builder.dataSource(dataSource)
.packages("....entity.db1")
.persistenceUnit("db1")
.build();
}
@Bean
@Primary
@Autowired
public JpaTransactionManager db1TransactionManager(@Qualifier("db1EntityManager") LocalContainerEntityManagerFactoryBean db1EntityManager) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(db1EntityManager.getObject());
return transactionManager;
}
}
|
以上で設定は完了。
あとは、普通のJPAの使用方法と同じようにリポジトリをDIしてメソッド内で呼び出せばよい。