JPA多数据源配置-Kotlin版本

1,使用环境:SpringBoot 3.0.6

2,application.yml配置文件配置好数据源

spring:
  datasource:
  	#第一个数据源
    test1:
      jdbc-url: jdbc:mysql://127.0.0.1:3306/test1?serverTimezone=Asia/Shanghai
      username: root
      password: 123456
      driver-class-name: com.mysql.cj.jdbc.Driver
    #第二个数据源
    test2:
      jdbc-url: jdbc:mysql://127.0.0.1:3306/test2?serverTimezone=Asia/Shanghai
      username: root
      password: 123456
      driver-class-name: com.mysql.cj.jdbc.Driver

3,配置Config

import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.boot.jdbc.DataSourceBuilder
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
import org.springframework.transaction.PlatformTransactionManager
import org.springframework.transaction.annotation.EnableTransactionManagement
import javax.sql.DataSource

/**
 * 多数据源配置
 */
@Configuration
class DataSourceConfig {
    /**
     * 主数据源
     */
    @Primary
    @Bean(name = ["test1DataSource"])
    @Qualifier("test1DataSource")
    //和yml配置的数据源前缀一致
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    fun systemDataSource(): DataSource {
        return DataSourceBuilder.create().build()
    }

    /**
     * 第二个数据源
     */
    @Bean(name = ["test2DataSource"])
    @Qualifier("test2DataSource")
    //和yml配置的数据源前缀一致
    @ConfigurationProperties(prefix = "spring.datasource.test2")
    fun messageDataSource(): DataSource {
        return DataSourceBuilder.create().build()
    }

}


/**
 * 主数据源配置Repository
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    entityManagerFactoryRef = "test1EntityManagerFactory",
    transactionManagerRef = "test1TransactionManager",
    //Repository所在位置
    basePackages = ["com.test1.repositorys"]
)
class Test1Config {
    @Autowired
    @Qualifier("test1DataSource")
    lateinit var test1DataSource: DataSource

    @Autowired
    lateinit var jpaProperties: JpaProperties

    @Autowired
    lateinit var hibernateProperties: HibernateProperties

    //主数据源
    @Primary
    @Bean(name = ["test1EntityManagerFactory"])
    fun entityManagerFactory(builder: EntityManagerFactoryBuilder): LocalContainerEntityManagerFactoryBean {
        val properties = hibernateProperties.determineHibernateProperties(jpaProperties.properties, HibernateSettings())
        return builder.dataSource(test1DataSource).properties(properties)
            //实体包路径
            .packages("com.test1.domains").build()
    }

    @Primary
    @Bean(name = ["test1TransactionManager"])
    fun systemTransactionManager(builder: EntityManagerFactoryBuilder): PlatformTransactionManager? {
        return entityManagerFactory(builder).`object`?.let { JpaTransactionManager(it) }
    }

}


/**
 * 第二个数据源配置Repository
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    entityManagerFactoryRef = "test2EntityManagerFactory",
    transactionManagerRef = "test2TransactionManager",
    //Repository所在位置
    basePackages = ["com.test2.repositorys"]
)
class Test2Config {

    @Autowired
    @Qualifier("test2DataSource")
    lateinit var test2DataSource: DataSource

    @Autowired
    lateinit var jpaProperties: JpaProperties

    @Autowired
    lateinit var hibernateProperties: HibernateProperties

    @Bean(name = ["test2EntityManagerFactory"])
    fun entityManagerFactory(builder: EntityManagerFactoryBuilder): LocalContainerEntityManagerFactoryBean {
        val properties = hibernateProperties.determineHibernateProperties(jpaProperties.properties, HibernateSettings())
        return builder.dataSource(test2DataSource).properties(properties)
            //实体包路径
            .packages("com.test2.domains").build()
    }

    @Bean(name = ["test2TransactionManager"])
    fun systemTransactionManager(builder: EntityManagerFactoryBuilder): PlatformTransactionManager? {
        return entityManagerFactory(builder).`object`?.let { JpaTransactionManager(it) }
    }
}

4,使用

//@Transactional 注解可以手动指定事物用以区分
@Transactional(value = "test2TransactionManager")
//EntityManager也需要手动指定
@Autowired
@Qualifier("test2EntityManagerFactory")
lateinit var entityManager: EntityManager
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值