多数据源配置与使用(2)(三十二)

本文详细介绍了如何在Spring Boot应用中配置多个数据源,并使用Spring Data JPA进行数据操作。通过实例展示了主从数据源的配置流程,包括实体类、Repository接口的创建及测试验证。

Spring-data-jpa支持

对于数据源的配置可以沿用上例中DataSourceConfig的实现。

新增对第一数据源的JPA配置,注意两处注释的地方,用于指定数据源对应的Entity实体和Repository定义位置,用@Primary区分主数据源。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories (
         entityManagerFactoryRef= "entityManagerFactoryPrimary" ,
         transactionManagerRef= "transactionManagerPrimary" ,
         basePackages= {  "com.didispace.domain.p"  })  //设置Repository所在位置
public  class  PrimaryConfig {
 
     @Autowired  @Qualifier ( "primaryDataSource" )
     private  DataSource primaryDataSource;
 
     @Primary
     @Bean (name =  "entityManagerPrimary" )
     public  EntityManager entityManager(EntityManagerFactoryBuilder builder) {
         return  entityManagerFactoryPrimary(builder).getObject().createEntityManager();
     }
 
     @Primary
     @Bean (name =  "entityManagerFactoryPrimary" )
     public  LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {
         return  builder
                 .dataSource(primaryDataSource)
                 .properties(getVendorProperties(primaryDataSource))
                 .packages( "com.didispace.domain.p" //设置实体类所在位置
                 .persistenceUnit( "primaryPersistenceUnit" )
                 .build();
     }
 
     @Autowired
     private  JpaProperties jpaProperties;
 
     private  Map<String, String> getVendorProperties(DataSource dataSource) {
         return  jpaProperties.getHibernateProperties(dataSource);
     }
 
     @Primary
     @Bean (name =  "transactionManagerPrimary" )
     public  PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
         return  new  JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
     }
 
}

  

新增对第二数据源的JPA配置,内容与第一数据源类似,具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories (
         entityManagerFactoryRef= "entityManagerFactorySecondary" ,
         transactionManagerRef= "transactionManagerSecondary" ,
         basePackages= {  "com.didispace.domain.s"  })  //设置Repository所在位置
public  class  SecondaryConfig {
 
     @Autowired  @Qualifier ( "secondaryDataSource" )
     private  DataSource secondaryDataSource;
 
     @Bean (name =  "entityManagerSecondary" )
     public  EntityManager entityManager(EntityManagerFactoryBuilder builder) {
         return  entityManagerFactorySecondary(builder).getObject().createEntityManager();
     }
 
     @Bean (name =  "entityManagerFactorySecondary" )
     public  LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {
         return  builder
                 .dataSource(secondaryDataSource)
                 .properties(getVendorProperties(secondaryDataSource))
                 .packages( "com.didispace.domain.s" //设置实体类所在位置
                 .persistenceUnit( "secondaryPersistenceUnit" )
                 .build();
     }
 
     @Autowired
     private  JpaProperties jpaProperties;
 
     private  Map<String, String> getVendorProperties(DataSource dataSource) {
         return  jpaProperties.getHibernateProperties(dataSource);
     }
 
     @Bean (name =  "transactionManagerSecondary" )
     PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
         return  new  JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
     }
 
}

  

完成了以上配置之后,主数据源的实体和数据访问对象位于:com.didispace.domain.p,次数据源的实体和数据访问接口位于:com.didispace.domain.s

分别在这两个package下创建各自的实体和数据访问接口

  • 主数据源下,创建User实体和对应的Repository接口
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    @Entity
    public  class  User {
     
         @Id
         @GeneratedValue
         private  Long id;
     
         @Column (nullable =  false )
         private  String name;
     
         @Column (nullable =  false )
         private  Integer age;
     
         public  User(){}
     
         public  User(String name, Integer age) {
             this .name = name;
             this .age = age;
         }
     
         // 省略getter、setter
     
    }
    public  interface  UserRepository  extends  JpaRepository<User, Long> {
     
    }

      

     

  • 从数据源下,创建Message实体和对应的Repository接口
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    @Entity
    public  class  Message {
     
         @Id
         @GeneratedValue
         private  Long id;
     
         @Column (nullable =  false )
         private  String name;
     
         @Column (nullable =  false )
         private  String content;
     
         public  Message(){}
     
         public  Message(String name, String content) {
             this .name = name;
             this .content = content;
         }
     
         // 省略getter、setter
     
    }
    public  interface  MessageRepository  extends  JpaRepository<Message, Long> {
     
    }

      

    接下来通过测试用例来验证使用这两个针对不同数据源的配置进行数据操作。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    @RunWith (SpringJUnit4ClassRunner. class )
    @SpringApplicationConfiguration (Application. class )
    public  class  ApplicationTests {
     
         @Autowired
         private  UserRepository userRepository;
         @Autowired
         private  MessageRepository messageRepository;
     
         @Test
         public  void  test()  throws  Exception {
     
             userRepository.save( new  User( "aaa" 10 ));
             userRepository.save( new  User( "bbb" 20 ));
             userRepository.save( new  User( "ccc" 30 ));
             userRepository.save( new  User( "ddd" 40 ));
             userRepository.save( new  User( "eee" 50 ));
     
             Assert.assertEquals( 5 , userRepository.findAll().size());
     
             messageRepository.save( new  Message( "o1" "aaaaaaaaaa" ));
             messageRepository.save( new  Message( "o2" "bbbbbbbbbb" ));
             messageRepository.save( new  Message( "o3" "cccccccccc" ));
     
             Assert.assertEquals( 3 , messageRepository.findAll().size());
     
         }
     
    }

转载于:https://www.cnblogs.com/MaxElephant/p/10239751.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值