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

    源码来源

最新文章

  1. web前端开发中常用的尺寸和位置
  2. eclipse项目打包
  3. 模块(configparser+shutil+logging)
  4. 【phpcms-v9】phpcms-v9二次开发所必须知道的步骤(转载)
  5. Codeforces 543D Road Improvement(树形DP + 乘法逆元)
  6. 更改RAC日志组
  7. Spark 机器学习
  8. Sublime Text 3常用快捷键 以及package control 安装
  9. office2010官方下载 免费完整版.zip
  10. Python之mongodb操作
  11. POJ 3176 Cow Bowling (水题DP)
  12. jquery easy ui 学习 (3) window 限制在父类窗体内
  13. sort,uniq命令
  14. HTML+CSS笔记 CSS进阶
  15. android api 中文 (75)—— AdapterView.OnItemClickListener
  16. [mysql] ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES).
  17. Django 发送邮件
  18. Android Service基础
  19. wcf双工通讯
  20. 执行monkey APK 制作

热门文章

  1. 双元素非递增(容斥)--Number Of Permutations Educational Codeforces Round 71 (Rated for Div. 2)
  2. 基于MatConvNet的CNN图像搜索引擎PicSearch
  3. postgres 常规操作杂记
  4. java中代码块和构造方法以及普通方法的代码执行顺序总结
  5. Auto-increment 自动增长
  6. 小知识 Sql 格式化工具 AutoPostBack后的定位 Post和Get区别 防止被 Fream
  7. windows下一步到位搭建pycharm的开发环境
  8. 在set中放入自定义类型
  9. java 矩阵的运算
  10. python异步IO编程(二)