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();}@Autowiredprivate JpaProperties jpaProperties;private MapgetVendorProperties(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();}@Autowiredprivate JpaProperties jpaProperties;private MapgetVendorProperties(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@GeneratedValueprivate 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@GeneratedValueprivate 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 {
@Autowiredprivate UserRepository userRepository;@Autowiredprivate MessageRepository messageRepository;@Testpublic 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