튜토리얼의 봄 Boot2 시리즈 (이십오) 봄 부트는 여러 데이터 소스 JPA를 통합

이 문서에서는 봄 부팅을 중심으로 모두 멀티 소스 데이터 통합 ​​문제 봄 부팅 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

송 창 스캔 코드 관련, 대중 번호 무대는 2TB, 노래 창 독점 매우 건조 2TB 무료 자바 학습을 얻기 회신

추천

출처www.cnblogs.com/lenve/p/11910161.html