2017-10-18 1 views
1

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

@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); 

} 

이 제어기이 application.properties이다

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

이다 (이 경우, 데이터 소스에이 저장소이다

@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; 
} 

} 

:

는 실체 1 db 만 참조) :

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

희망의 모든

+0

각''LocalContainerEntityManagerFactoryBean'beans는 원하는 데이터베이스와 연관된 dataSource가있는 각각 정의 할 수 있습니다. – mrkernelpanic

답변

1

가 동일한 도메인 클래스를 가질 수 2 개의 다른 JPA 저장소 class.but에 대해 서로 다른 사양을해야합니다 서로 다른 데이터 소스와이 두 설정 파일에이 개 설정 파일을 작성 분명하다.

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

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 

2 단계> 먼저는 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); 
    } 
} 

STEP3> 기타는 dataSource에 대한 또 다른 설정 파일,

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

그리고 변화 접두사를 만들 Similary

@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);