配置文件

# mian DB properties:
main.datasource.jdbcUrl=jdbc:mysql://localhost:3306/emipe?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
main.datasource.username=root
main.datasource.password=root
main.datasource.driverClassName=com.mysql.cj.jdbc.Driver
# other DB config
other.datasource.jdbcUrl=jdbc:mysql://192.168.20.77:3306/gaea_dev?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
other.datasource.username=root
other.datasource.password=1qaz369*
other.datasource.driverClassName=com.mysql.cj.jdbc.Driver

配置数据源dataSource

@Configuration
public class DataSourceConfig {
    // 注意,这里需要有一个@Primary注解,
    // 告诉框架有两个实现类的时候优先选择这个实现类,
    // 如果不使用会报错“required a bean of type 'org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties' that could not be found.”
    @Primary
    // @Bean后面的括号的内容可有可无,因为我这里的写法很规范,方法名就是mainDataSource
    // 如果不一样需要@Bean加上声明的变量名称
    @Bean("mainDataSource")
    @ConfigurationProperties(prefix = "main.datasource")
    public DataSource mainDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean("otherDataSource")
    @ConfigurationProperties(prefix = "other.datasource")
    public DataSource otherDataSource() {
        return DataSourceBuilder.create().build();
    }
}

配置EntityManagerFactory和TransactionManager

第一个数据源的配置

/**
 * @author caicai
 * @create 2021/6/4
 */
@Configuration
// 启用事务管理注解
@EnableTransactionManagement
// 启用JPA仓库注解,
// 其中第一个属性对应Bean名称为”mainEntityManagerFactory“的对象,声明了该数据源所使用的对象管理类工厂
// 第二个属性声明事务管理器,对应名称为”mainTransactionManager“的JavaBean
// 第三个属性表示dao层所在的包
@EnableJpaRepositories(entityManagerFactoryRef = "mainEntityManagerFactory", transactionManagerRef = "mainTransactionManager",
        basePackages = {"com.caicai.emipe.persistence.main"})
public class MainDataSourceConfig {

    @Autowired
    @Qualifier("mainDataSource")
    private DataSource mainDataSource;

    @Autowired(required = false)
    private JpaProperties jpaProperties;


    @Autowired
    private HibernateProperties hibernateProperties;

    // 配置EntityManagerFactory,因为一共有两个数据源,
    // 其中一个在配置EntityManagerFactory时需要加@Primary注解
    @Primary
    @Bean(name = "mainEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean mainEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(mainDataSource)
                //设置entity所在位置
                .packages("com.caicai.emipe.persistence.main")
                .persistenceUnit("mainPersistenceUnit")
                .properties(getVendorProperties())
                .build();
    }

    private Map<String, Object> getVendorProperties() {
        return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
    }

    // 配置事务管理器,也需要添加@Primary注解
    @Primary
    @Bean(name = "mainTransactionManager")
    public PlatformTransactionManager mainTransactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(mainEntityManagerFactory(builder).getObject());
    }
}

第二个数据源的配置


/**
 * @author caicai
 * @create 2021/6/4
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "otherEntityManagerFactory", transactionManagerRef = "otherTransactionManager",
        basePackages = {"com.caicai.emipe.persistence.other"})
public class OtherDataSourceConfig {

    @Autowired
    @Qualifier("otherDataSource")
    private DataSource otherDataSource;

    @Autowired
    private JpaProperties jpaProperties;

    @Autowired
    private HibernateProperties hibernateProperties;

    @Bean(name = "otherEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean otherEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(otherDataSource)
                .packages("com.caicai.emipe.persistence.other")
                .persistenceUnit("otherPersistenceUnit")
                .properties(getVendorProperties())
                .build();
    }

    private Map<String, Object> getVendorProperties() {
        return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
    }

    @Bean(name = "otherTransactionManager")
    public PlatformTransactionManager otherTransactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(otherEntityManagerFactory(builder).getObject());
    }

}

Entity和Repository

根据之前的配置位置写入实体类和Repository,这个就跟平常使用Jpa一样,对应的表名不要写串了


版权声明:本文为weixin_44712778原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_44712778/article/details/117698900