Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源

spring.jpa.properties.hibernate.ddl-auto=update

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect

这里 Jpa 的配置和上文相比 key 中多了 properties,多数据源的配置和前文一致,然后接下来配置两个 DataSource,如下:

@Configuration

public class DataSourceConfig {

@Bean

@ConfigurationProperties(prefix = “spring.datasource.one”)

@Primary

DataSource dsOne() {

return DruidDataSourceBuilder.create().build();

}

@Bean

@ConfigurationProperties(prefix = “spring.datasource.two”)

DataSource dsTwo() {

return DruidDataSourceBuilder.create().build();

}

}

这里的配置和前文的多数据源配置基本一致,但是注意多了一个在 Spring 中使用较少的注解 @Primary,这个注解一定不能少,否则在项目启动时会出错,@Primary 表示当某一个类存在多个实例时,优先使用哪个实例。

好了,这样,DataSource 就有了。

多数据源配置


接下来配置 Jpa 的基本信息,这里两个数据源,我分别在两个类中来配置,先来看第一个配置:

@Configuration

@EnableJpaRepositories(basePackages = “org.javaboy.jpa.dao”,entityManagerFactoryRef = “localContainerEntityManagerFactoryBeanOne”,transactionManagerRef = “platformTransactionManagerOne”)

public class JpaConfigOne {

@Autowired

@Qualifier(value = “dsOne”)

DataSource dsOne;

@Autowired

JpaProperties jpaProperties;

@Bean

@Primary

LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBeanOne(EntityManagerFactoryBuilder builder) {

return builder.dataSource(dsOne)

.packages(“org.javaboy.jpa.model”)

.properties(jpaProperties.getProperties())

.persistenceUnit(“pu1”)

.build();

}

@Bean

PlatformTransactionManager platformTransactionManagerOne(EntityManagerFactoryBuilder builder) {

LocalContainerEntityManagerFactoryBean factoryBeanOne = localContainerEntityManagerFactoryBeanOne(builder);

return new JpaTransactionManager(factoryBeanOne.getObject());

}

}

首先这里注入 dsOne,再注入 JpaProperties,JpaProperties 是系统提供的一个实例,里边的数据就是我们在 application.properties 中配置的 jpa 相关的配置。然后我们提供两个 Bean,分别是 LocalContainerEntityManagerFactoryBean 和 PlatformTransactionManager 事务管理器,不同于 MyBatis 和 JdbcTemplate,在 Jpa 中,事务一定要配置。在提供 LocalContainerEntityManagerFactoryBean 的时候,需要指定 packages,这里的 packages 指定的包就是这个数据源对应的实体类所在的位置,另外在这里配置类上通过 @EnableJpaRepositories 注解指定 dao 所在的位置,以及 LocalContainerEntityManagerFactoryBean 和 PlatformTransactionManager 分别对应的引用的名字。

好了,这样第一个就配置好了,第二个基本和这个类似,主要有几个不同点:

  • dao 的位置不同

  • persistenceUnit 不同

  • 相关 bean 的名称不同

注意实体类可以共用。

代码如下:

@Configuration

@EnableJpaRepositories(basePackages = “org.javaboy.jpa.dao2”,entityManagerFactoryRef = “localContainerEntityManagerFactoryBeanTwo”,transactionManagerRef = “platformTransactionManagerTwo”)

public class JpaConfigTwo {

@Autowired

@Qualifier(value = “dsTwo”)

DataSource dsTwo;

@Autowired

JpaProperties jpaProperties;

@Bean

LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBeanTwo(EntityManagerFactoryBuilder builder) {

return builder.dataSource(dsTwo)

.packages(“org.javaboy.jpa.model”)

.properties(jpaProperties.getProperties())

.persistenceUnit(“pu2”)

.build();

}

@Bean

PlatformTransactionManager platformTransactionManagerTwo(EntityManagerFactoryBuilder builder) {

LocalContainerEntityManagerFactoryBean factoryBeanTwo = localContainerEntityManagerFactoryBeanTwo(builder);

return new JpaTransactionManager(factoryBeanTwo.getObject());

}

}

接下来,在对应位置分别提供相关的实体类和 dao 即可,数据源一的 dao 如下:

package org.javaboy.jpa.dao;

public interface UserDao extends JpaRepository<User,Integer> {

List getUserByAddressEqualsAndIdLessThanEqual(String address, Integer id);

@Query(value = “select * from t_user where id=(select max(id) from t_user)”,nativeQuery = true)

User maxIdUser();

}

数据源二的 dao 如下:

package org.javaboy.jpa.dao2;

public interface UserDao2 extends JpaRepository<User,Integer> {

List getUserByAddressEqualsAndIdLessThanEqual(String address, Integer id);

@Query(value = “select * from t_user where id=(select max(id) from t_user)”,nativeQuery = true)

User maxIdUser();

}

共同的实体类如下:

package org.javaboy.jpa.model;

@Entity(name = “t_user”)

public class User {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Integer id;

private String username;

private String address;

//省略getter/setter

}

到此,所有的配置就算完成了,接下来就可以在 Service 中注入不同的 UserDao,不同的 UserDao 操作不同的数据源。

其实整合 Jpa 多数据源也不算难,就是有几个细节问题,这些细节问题解决,其实前面介绍的其他多数据源整个都差不多。

最后

这份《“java高分面试指南”-25分类227页1000+题50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香)

image

image

据源。

其实整合 Jpa 多数据源也不算难,就是有几个细节问题,这些细节问题解决,其实前面介绍的其他多数据源整个都差不多。

最后

这份《“java高分面试指南”-25分类227页1000+题50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香)

[外链图片转存中…(img-vd9HNPbZ-1721154191494)]

[外链图片转存中…(img-nkc1SDl7-1721154191495)]

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Spring BootJPA实现多数据源时,需要进行以下步骤: 1. 配置数据源:在application.properties文件中,配置多个数据源的连接信息。每个数据源都需要设置独特的前缀。 2. 创建多个数据源Bean:在代码中,使用@Configuration和@Bean注解创建多个数据源的实例。每个数据源的实例需要设置对应的连接信息。 3. 创建EntityManagerFactory:使用LocalContainerEntityManagerFactoryBean创建多个EntityManagerFactory实例。每个实例需要设置对应的数据源和持久化单元。 4. 创建JpaTransactionManager:使用PlatformTransactionManager的实现类JpaTransactionManager创建多个事务管理器实例。每个实例都需要设置对应的EntityManagerFactory。 5. 定义Repository:创建多个Repository接口,并分别使用@PersistenceContext注解注入不同的EntityManager实例。 6. 配置事务:使用@EnableTransactionManagement注解启用事务管理,并使用@Transactional注解定义事务的范围。 7. 使用不同的数据源:在代码中使用@Qualifier注解指定需要使用的数据源。在进行相关数据库操作时,使用相应的Repository来访问对应的数据源。 通过以上步骤,就能够使用Spring BootJPA实现多数据源的配置和使用。每个数据源都可以连接到不同的数据库,对应的Repository可以访问并操作各自的数据源。这样就可以实现在同一个应用程序中对多个数据源的管理和操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值