이 문서에서는 봄 부팅을 중심으로 모두 멀티 소스 데이터 통합 문제 봄 부팅 JPA에 대한 이야기로, 솔루션 지속성 데이터를 통합 마지막 하나입니다. 봄 부팅 통합 JbdcTemplate 여러 데이터 소스에서 봄 부팅이 가장 구성 할 때 MyBatis로 봄 부팅 JPA의 세 가지 점에 대한 지식, JPA가 가장 복잡한 것으로 간주 여러 데이터 소스의 통합뿐만 아니라 많은 사람들이 여러 데이터 소스를 통합하는 여러 데이터 소스를 통합 고장 쉽게 유형입니다. 이 문서 모두가 노래 게르마늄 튜토리얼 단계 JPA에 의해 단계는 여러 데이터 소스를 통합을 따릅니다.
프로젝트 생성
먼저 다음과 같이 기본 웹, JPA를 추가와 MySQL에 의존하는 봄 부트 프로젝트를 생성 만드는 것입니다 :
생성되면, 드루이드 의존성, 여기 봄 부팅 드루이드 만들어 사용에 관해서는 전술 한 요구 사항에 추가, 모든 사람이 의존 DruidDataSourceBuilder을 가지고 있기 때문에 여러 데이터 소스의 통합이 마지막으로,이 의존도를 사용해야하는 경우 있음을 발견 할 수 있습니다 또한 대부분의 사람들은 여전히 8.x를하기보다는 MySQL의 5.x의를 사용할 수 있기 때문에, 버전에 따라 데이터베이스를 잠글 기억 전체 의존은 다음과 같습니다 :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.28</version>
<scope>runtime</scope>
</dependency>
프로젝트의 성공을 만든 후 그래서.
기본 구성
기본 구성에서는 처음 구성 여러 데이터 소스뿐만 아니라 기본 정보 데이터 소스는 먼저 다음과 같은 구성 정보 application.properties을에 추가 :
# 数据源一
spring.datasource.one.username=root
spring.datasource.one.password=root
spring.datasource.one.url=jdbc:mysql:///test01?useUnicode=true&characterEncoding=UTF-8
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
# 数据源二
spring.datasource.two.username=root
spring.datasource.two.password=root
spring.datasource.two.url=jdbc:mysql:///test02?useUnicode=true&characterEncoding=UTF-8
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
# Jpa配置
spring.jpa.properties.database=mysql
spring.jpa.properties.show-sql=true
spring.jpa.properties.database-platform=mysql
spring.jpa.properties.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
여기 JPA를 위에 배치하고, 복수의 특성과 동일한 키를 비교하여, 다수의 데이터 소스와 상기 후 다음 두 개의 데이터 소스 구성의 구성은 다음과 같이 :
@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();
}
}
더 봄에 몇 가지 메모 @primary 이외의 사용에 멀티하여 상기의 구성과 기본적으로 동일한 데이터 소스 구성하지만, 관심을 지불,이 코멘트이어야한다, 또는 프로젝트의 시작에서 기본 수단 @, 잘못 할 때 특정 클래스가 여러 인스턴스, 어떤 인스턴스 우선 순위의 사용에있을 때.
좋아, 그럼,이 데이터 소스.
여러 데이터 소스 구성
다음으로, 기본 정보의 구성 JPA 여기서 두 개의 데이터 소스를 각각 두 클래스에서 I 구성하려면 먼저 구성에 첫번째보기 :
@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 관련 구성이다. 그런 다음 우리는 두 개의 콩을 제공 LocalContainerEntityManagerFactoryBean 및 PlatformTransactionManager를 트랜잭션 관리자, MyBatis로와 JdbcTemplate과는 달리, JPA에서, 트랜잭션 구성해야합니다. LocalContainerEntityManagerFactoryBean 제공되면, 패키지를 지정 필요성이 패키지의 패키지가 해당 엔티티 클래스가 @EnableJpaRepositories 의해 위치 또한 구성 클래스 본원에 지정된 위치에 각각 주석을 DAO, 지정된 데이터 소스가있는 위치 LocalContainerEntityManagerFactoryBean 및 PlatformTransactionManager를 대응 이름 참조.
좋아 구성된 첫 번째 염기와 유사하므로, 몇 가지 차이점이있다 :
- 다오 다른 위치
- 다른 persistenceUnit
- 빈에 관련된 다른 이름
엔티티 클래스를 공유 할 수 있습니다.
다음과 같이 코드입니다 :
@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<User> 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<User> 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
}
이 모든 구성이 완료되는 경우에도, 다음 주사는 다른 UserDao 서비스, 서로 다른 데이터 소스 UserDao의 다른 작동 할 수 있습니다.
사실이다 JPA가 너무 어려운 일이 아니다 여러 데이터 소스의 통합, 사실 몇 가지 세부 사항, 해결 이러한 문제의 세부 사항이있다, 더 이전에 기술 된 다른 데이터 소스에 걸쳐 유사한보다.
음,이 문서는 여기에 소개합니다.
관련 사례가 GitHub의에 업로드 된, 작은 친구는 다운로드에 오신 것을 환영합니다 : https://github.com/lenve/javaboy-code-samples