企业分布式微服务云SpringCloud SpringBoot mybatis (十)Spring Boot多数据源配置与使用Spring-data-jpa支持...

Spring-data-jpa支持

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

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

@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配置,内容与第一数据源类似,具体如下:

@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接口 @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接口 @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> {

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

@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());

}
复制代码

}

源码来源:http://minglisoft.cn/honghu/technology.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值