この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:1
ページ更新者:T
更新日時:2019-04-04 10:29:33

タイトル: 複数の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してメソッド内で呼び出せばよい。