Springboot3配置JPA多数据源

一、连接配置

spring:
  datasource:
      url: "jdbc:mysql://localhost/first"
      username: "dbuser"
      password: "dbpass"
      driver-class-name: com.mysql.cj.jdbc.Driver

second:
  datasource:
      url: "jdbc:mysql://localhost/second"
      username: "dbuser"
      password: "dbpass"
      driver-class-name: com.mysql.cj.jdbc.Driver

二、参考官方文档,配置数据源

package com.xx.xx.xx.db;  
  
import com.zaxxer.hikari.HikariDataSource;  
import javax.sql.DataSource;  
import org.springframework.beans.factory.annotation.Qualifier;  
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;  
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;  
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.orm.jpa.JpaTransactionManager;  
import org.springframework.orm.jpa.JpaVendorAdapter;  
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;  
import org.springframework.orm.jpa.vendor.Database;  
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;  
import org.springframework.transaction.PlatformTransactionManager;  
  
/**
 *
 */
@Configuration(proxyBeanMethods = false)  
public class DBMainConfig {  
    @Bean  
    @Primary    
    @ConfigurationProperties(prefix = "spring.datasource")  
    public DataSourceProperties firstDataSourceProperties() {  
        return new DataSourceProperties();  
    }  
    @Bean  
    @Primary    
    public HikariDataSource firstDataSource(DataSourceProperties firstDataSourceProperties) {  
        return firstDataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class)  
            .build();  
    } 

    @Bean  
    @Primary    
    @ConfigurationProperties("spring.jpa")  
    public JpaProperties firstJpaProperties() {  
        JpaProperties jpaProperties = new JpaProperties();  
        jpaProperties.setShowSql(true);  
        jpaProperties.setDatabase(Database.MYSQL);  
        jpaProperties.setGenerateDdl(false);  
        return jpaProperties;  
    }  
    @Bean  
    @Primary    public LocalContainerEntityManagerFactoryBean entityManagerFactory(  
        @Qualifier("firstDataSource") DataSource firstDataSource,  
        @Qualifier("entityManagerFactoryBuilder") EntityManagerFactoryBuilder builder) {  
        return builder.dataSource(firstDataSource)
	        .packages("com.xx.xx.entity")  // 第一个数据源entity所在
            .persistenceUnit("firstDs")  
            .build();  
    }  
    @Bean  
    @Primary    public EntityManagerFactoryBuilder entityManagerFactoryBuilder(JpaProperties jpaProperties) {  
        JpaVendorAdapter jpaVendorAdapter = createJpaVendorAdapter(jpaProperties);  
        return new EntityManagerFactoryBuilder(jpaVendorAdapter, jpaProperties.getProperties(),  
            null);  
    }  
          
    @Bean(name = "transactionManagerPrimary")  
    @Primary  
    public PlatformTransactionManager transactionManager(  
        @Qualifier("entityManagerFactory") LocalContainerEntityManagerFactoryBean entityManagerFactory) {  
        return new JpaTransactionManager(entityManagerFactory.getObject());  
    }  
    private JpaVendorAdapter createJpaVendorAdapter(JpaProperties jpaProperties) {  
        // ... map JPA properties as needed  
        return new HibernateJpaVendorAdapter();  
    }   

    @Bean  
    @ConfigurationProperties(prefix = "sencond.datasource")  
    public DataSourceProperties secondDataSourceProperties() {  
        return new DataSourceProperties();  
    }  
    @Bean  
    public HikariDataSource secondDataSource(  
        @Qualifier("secondDataSourceProperties") DataSourceProperties secondDataSourceProperties) {  
        return secondDataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class)  
            .build();  
    }  
          
    @Bean  
    public EntityManagerFactoryBuilder secondEntityManagerFactoryBuilder(  
        JpaProperties jpaProperties) {  
        JpaVendorAdapter jpaVendorAdapter = createJpaVendorAdapter(jpaProperties);  
        return new EntityManagerFactoryBuilder(jpaVendorAdapter, jpaProperties.getProperties(),  
            null);  
    }  
    @Bean  
    public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory(  
        @Qualifier("secondDataSource") DataSource secondDataSource,  
        @Qualifier("secondEntityManagerFactoryBuilder") EntityManagerFactoryBuilder builder) {  
        return builder.dataSource(secondDataSource)  
            .packages("com.xx.xx.second.entity")   // 第二个数据源entity所在
            .persistenceUnit("secondDs")  
            .build();  
    }  
    @Bean(name = "transactionManagerSecond")  
    public PlatformTransactionManager secondTransactionManager(  
        @Qualifier("secondEntityManagerFactory") LocalContainerEntityManagerFactoryBean secondEntityManagerFactory) {  
        return new JpaTransactionManager(secondEntityManagerFactory.getObject());  
    }  
}

三、分数据源配置事务管理、实体管理

basePackages 用于设置 JpaRepository 与前面LocalContainerEntityManagerFactoryBean配置的packages设置的entity需要一一对应
主数据源相关配置

package com.xx.xx.xx.db;  
  
import org.springframework.context.annotation.Configuration;  
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;  
import org.springframework.transaction.annotation.EnableTransactionManagement;  
  
/**  
 * 
 */
@Configuration  
@EnableTransactionManagement  
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory",  
    transactionManagerRef = "transactionManagerPrimary",  
    basePackages = {"com.xx.xx.dao"})  // 第一个数据源JpaRepository所在
public class PrimaryConfig {  
  
}

其他数据配置

package com.xx.xx.xx.db;  
  
import org.springframework.context.annotation.Configuration;  
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;  
import org.springframework.transaction.annotation.EnableTransactionManagement;  
  
/**  
 * 
 */
@Configuration  
@EnableTransactionManagement  
@EnableJpaRepositories(entityManagerFactoryRef = "secondEntityManagerFactory",  
    transactionManagerRef = "transactionManagerSecond",  
    basePackages = {"com.xx.xx.second.dao"})  // 第二个数据源JpaRepository所在
public class SecondConfig {  
  
}
posted @ 2025-05-09 16:43  pinenuts  阅读(236)  评论(0)    收藏  举报