jpa多数据源配置

jpa多数据源配置

因为本人在学习jpa多数据源配置的时候,查到很多资料,发现里面有些小的坑很多文章没有写出来,导致花费冤枉时间,因此写了这篇文章,以供后来者学习是不必重复的采坑。

spring:
  datasource:
    test1:
      password: ****
      username: root
      jdbc-url: jdbc:mysql://localhost:3306/**?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
      driver-class-name: com.mysql.cj.jdbc.Driver
    test2:
      password: ****
      username: root
      jdbc-url: jdbc:mysql://localhost:3306/***?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
      driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    database-platform: org.hibernate.dialect.MySQLDialect //设置方言,这个为必须设置项
    show-sql: true

配置数据源是不能有URL,要用jdbc-url,否则会报错
注册DataSource

@Configuration
public class datasource {
    /**
     * 返回data2数据库的数据源
     * @return
     */
    @Primary
    @Qualifier("dataSource1")
    @Bean(name="dataSource1")
    @ConfigurationProperties(prefix = "spring.datasource.test1") // 数据源配置路径
    public DataSource dataSource1(){
        return DataSourceBuilder.create().build();
    }

    /**
     * 返回data2数据库的数据源
     * @return
     */
    @Qualifier("dataSource2")
    @Bean(name="dataSource2")
    @ConfigurationProperties(prefix = "spring.datasource.test2")
    public DataSource dataSource2(){
        return DataSourceBuilder.create().build();
    }
}

@Configuration
@EnableJpaRepositories(basePackages = "com.project.datasource.repositry1",//dao层文件路径
        entityManagerFactoryRef = "entityManagerFactoryPrimary1",
        transactionManagerRef = "transactionManagerPrimary1")
public class datasource1 {

    @Autowired
    @Qualifier("dataSource1")
    private DataSource primaryDataSource;

    @Autowired
    JpaProperties jpaProperties;

    @Primary
    @Bean(name="entityManagerPrimary1")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder){
        return entityManagerFactoryBean(builder).getObject().createEntityManager();
    }

    @Primary
    @Bean(name="entityManagerFactoryPrimary1")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(
            EntityManagerFactoryBuilder builder){
        return builder
                .dataSource(primaryDataSource)
                .properties(jpaProperties.getProperties())//获取jdbc的配置
                .packages("com.project.datasource.entity")//实体类路径
                .persistenceUnit("primaryPersistenceUnit")
                .build();
    }

    @Primary
    @Bean(name="transactionManagerPrimary1")
    public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder){
        return new JpaTransactionManager(entityManagerFactoryBean(builder).getObject());
    }
}

然后注册dao层即可使用,小编在使用的时候发现其讲实体类转化为sql时,不能将实体类名驼峰化,例如:userName转化成user_name,这个问题待应该有解决的办法,但是目前没有找到相应的方法,如果有解决了的小伙伴,请下方留言,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Spring Boot和JPA的多数据配置示例代码: 1. 在application.properties文件中配置数据 ``` # 主数据 spring.datasource.url=jdbc:mysql://localhost:3306/main_db?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 第二个数据 second.datasource.url=jdbc:mysql://localhost:3306/second_db?useSSL=false&serverTimezone=UTC second.datasource.username=root second.datasource.password=root second.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` 2. 创建两个数据的实例 ``` @Configuration @EnableTransactionManagement public class DataSourceConfig { // 主数据 @Bean(name = "mainDataSource") @Primary @ConfigurationProperties(prefix = "spring.datasource") public DataSource mainDataSource() { return DataSourceBuilder.create().build(); } // 第二个数据 @Bean(name = "secondDataSource") @ConfigurationProperties(prefix = "second.datasource") public DataSource secondDataSource() { return DataSourceBuilder.create().build(); } } ``` 3. 创建EntityManagerFactory实例 ``` @Configuration @EnableJpaRepositories( basePackages = "com.example.main_db.repository", entityManagerFactoryRef = "mainEntityManagerFactory", transactionManagerRef = "mainTransactionManager" ) public class MainDbConfig { @Autowired @Qualifier("mainDataSource") private DataSource mainDataSource; @Bean(name = "mainEntityManagerFactory") public LocalContainerEntityManagerFactoryBean mainEntityManagerFactory(EntityManagerFactoryBuilder builder) { return builder .dataSource(mainDataSource) .packages("com.example.main_db.entity") .persistenceUnit("mainPersistenceUnit") .build(); } @Bean(name = "mainTransactionManager") public PlatformTransactionManager mainTransactionManager(@Qualifier("mainEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } } ``` 4. 创建第二个数据的EntityManagerFactory实例 ``` @Configuration @EnableJpaRepositories( basePackages = "com.example.second_db.repository", entityManagerFactoryRef = "secondEntityManagerFactory", transactionManagerRef = "secondTransactionManager" ) public class SecondDbConfig { @Autowired @Qualifier("secondDataSource") private DataSource secondDataSource; @Bean(name = "secondEntityManagerFactory") public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory(EntityManagerFactoryBuilder builder) { return builder .dataSource(secondDataSource) .packages("com.example.second_db.entity") .persistenceUnit("secondPersistenceUnit") .build(); } @Bean(name = "secondTransactionManager") public PlatformTransactionManager secondTransactionManager(@Qualifier("secondEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } } ``` 5. 在需要使用的Repository中指定使用哪个EntityManagerFactory ``` @Repository @Transactional(transactionManager = "mainTransactionManager") public interface MainDbRepository extends JpaRepository<MainEntity, Long> { } @Repository @Transactional(transactionManager = "secondTransactionManager") public interface SecondDbRepository extends JpaRepository<SecondEntity, Long> { } ``` 这样就完成了基于Spring Boot和JPA的多数据配置。在需要访问不同的数据库时,只需要在Repository中指定对应的TransactionManager即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值