복붙노트

[SPRING] Spring Boot - 다른 데이터베이스에 대해 동일한 저장소와 동일한 엔티티

SPRING

Spring Boot - 다른 데이터베이스에 대해 동일한 저장소와 동일한 엔티티

하나의 엔티티와 하나의 저장소가이 엔티티에 연결된 스프링 부트 프로젝트가 있습니다. 저장소에는 사용자 지정 쿼리가있는 방법이 하나 있으며 프로젝트 컨트롤러에서이 저장소는 다른 postgresql 데이터베이스의 데이터를 반환하는 데 사용됩니다. 이러한 데이터베이스는 동일한 열이있는 동일한 테이블을 가지므로 (참조 된 엔터티는 동일 함) 이러한 데이터베이스 간의 유일한 차이는 연도 (..., DB2015, DB2016, DB2017)입니다. 내 질문은 : 어떻게 "다른"데이터베이스에 속하는 프로젝트 컨트롤러에서 데이터를 반환 할 수 있습니까? 동일한 쿼리를 사용하여 첫 번째 데이터베이스에서 데이터를 선택한 다음 두 번째 데이터베이스에서 데이터를 선택할 수 있습니까? 다른 질문에 나는 다른 데이터 소스가 필요하다는 것을 읽었습니다, 이것이 맞습니까?

이것이 엔티티입니다.

@Entity(name = "REQUEST")
public class Request implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@Column(name="IDREQUEST", nullable=false)
private BigDecimal idrequest;


@Column(name="PAYLOAD")
private String payload;

@Column(name="MITTENTE")
private String mittente;

@Column(name="SERVIZIO")
private String servizio;

@Column(name="DATARICEZIONE")
private BigDecimal dataricezione;

public BigDecimal getIdrequest() {
    return idrequest;
}

public void setIdrequest(BigDecimal idrequest) {
    this.idrequest = idrequest;
}

public String getPayload() {
    return payload;
}

public void setPayload(String payload) {
    this.payload = payload;
}

public String getMittente() {
    return mittente;
}

public void setMittente(String mittente) {
    this.mittente = mittente;
}

public String getServizio() {
    return servizio;
}

public void setServizio(String servizio) {
    this.servizio = servizio;
}

public BigDecimal getDataricezione() {
    return dataricezione;
}

public void setDataricezione(BigDecimal dataricezione) {
    this.dataricezione = dataricezione;
}

}

이것은 저장소입니다.

@Repository
public interface RequestRepository extends PagingAndSortingRepository<Request, BigDecimal> {

    @Query(nativeQuery=true, value="SELECT * FROM \"REQUEST\" WHERE strpos(\"PAYLOAD\",\'?1\') > 0")
    List<Request> findByCodiceFiscale(String codiceFiscale);

}

이 컨트롤러입니다.

@RequestMapping(value="/ricercaadesioni/{codicefiscale}", method=RequestMethod.GET)
public ResponseEntity<List<Request>> ricercaAdesioniByCodiceFIscale(@PathVariable("codicefiscale") String codicefiscale) {

    List<Request> listAdesioni = requestRepo.findByCodiceFiscale(codicefiscale);

    return new ResponseEntity<List<Request>>(listAdesioni, HttpStatus.OK);
}

이것은 application.properties입니다 (이 경우 데이터 소스는 하나의 db 만 참조합니다).

spring.datasource.url=jdbc:postgresql://localhost:5432/DB2017_test
spring.datasource.username=xxx
spring.datasource.password=xxx

희망은 모든 것이 분명하다.

해결법

  1. ==============================

    1.서로 다른 데이터 소스로 2 개의 설정 파일을 생성하십시오.이 2 개의 설정 파일은 2 개의 다른 jpa 저장소 클래스에 대해 서로 다른 사양을 갖습니다. 그러나 동일한 도메인 클래스를 가질 수 있습니다.

    서로 다른 데이터 소스로 2 개의 설정 파일을 생성하십시오.이 2 개의 설정 파일은 2 개의 다른 jpa 저장소 클래스에 대해 서로 다른 사양을 갖습니다. 그러나 동일한 도메인 클래스를 가질 수 있습니다.

    step1> 속성 파일에 두 개의 데이터 소스 세부 정보가 있습니다.

    spring.datasource.url=jdbc:postgresql://localhost:5432/DB2017_test
    spring.datasource.username=xxx
    spring.datasource.password=xxx
    
    
    # DB2018 DB - ""
    spring.datasource2.url=jdbc:postgresql://localhost:5432/DB2018_test
    spring.datasource2.username=xxx
    spring.datasource2.password=xxx
    

    step2> 그런 다음 첫 번째 dataSource에 대한 설정 파일을 만듭니다.

    package com.package1;
    
    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(
      entityManagerFactoryRef = "entityManagerFactory",
      basePackages = { "com.package1.repo" } 
    )
    public class DB2017Config {
    
      @Primary
      @Bean(name = "dataSource")
      @ConfigurationProperties(prefix = "spring.datasource")
      public DataSource dataSource() {
        return DataSourceBuilder.create().build();
      }
    
      @Primary
      @Bean(name = "entityManagerFactory")
      public LocalContainerEntityManagerFactoryBean 
      entityManagerFactory(
        EntityManagerFactoryBuilder builder,
        @Qualifier("dataSource") DataSource dataSource
      ) {
        return builder
          .dataSource(dataSource)
          .packages("com.domain")
          .persistenceUnit("foo")
          .build();
      }
    
      @Primary
      @Bean(name = "transactionManager")
      public PlatformTransactionManager transactionManager(
        @Qualifier("entityManagerFactory") EntityManagerFactory 
        entityManagerFactory
      ) {
        return new JpaTransactionManager(entityManagerFactory);
      }
    }
    

    3 단계> 유사성은 다른 dataSource에 대한 또 다른 설정 파일을 만듭니다.

    @EnableJpaRepositories(
      entityManagerFactoryRef = "entityManagerFactory",
      basePackages = { "com.package2.repo" }
    

    접두어 변경

    @ConfigurationProperties(prefix = "spring.datasource2")
    

    이제 위에서 언급 한 것처럼 package1과 package2에 비슷한 2 개의 RequestRepository1과 RequestRepository2 (basePackages = { "com.package1.repo"})가 생깁니다.

    step4> 모든 설정 autowire 2 개의 다른 repo.

    @Autowired
    private final RequestRepository1  repo1;
    @Autowired
    private final RequestRepository2  repo2;
    

    그런 다음 사용하십시오.

    List<Request> listAdesioni = repo1.findByCodiceFiscale(codicefiscale);
    List<Request> listAdesioni = repo2.findByCodiceFiscale(codicefiscale);
    
  2. from https://stackoverflow.com/questions/46808485/spring-boot-same-repository-and-same-entity-for-different-databases by cc-by-sa and MIT license