2017-10-18 119 views
1

我有一個Spring Boot項目,其中一個實體和一個存儲庫與此實體關聯。在存儲庫中有一個使用自定義查詢的方法,而在項目控制器中,此存儲庫用於從不同的postgresql數據庫返回數據。這些數據庫具有相同的表,並且具有相同的列(因此所引用的實體是相同的),這些數據庫之間的唯一區別是年(...,DB2015,DB2016,DB2017)。 我的問題是:我如何返回屬於「不同」數據庫的項目控制器中的數據?是否可以使用相同的查詢從第一個數據庫開始選擇數據,然後從第二個數據庫等選擇數據? 在其他問題我讀過,我需要不同的數據源,這是正確的?Spring Boot - 同一個存儲庫和不同數據庫的相同實體

這是實體:

@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(在這種情況下的數據源僅指一個分貝):

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

希望一切都清楚了

+0

您可以定義多個'LocalContainerEntityManagerFactoryBean'beans,每個''具有與所需數據庫關聯的數據源。 – mrkernelpanic

回答

1

創建具有不同的數據源,這2個配置文件2的配置文件將有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 

二>然後創建了第一個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>與之相似創造和其他數據源的另一個配置文件,

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

而變化前綴

@ConfigurationProperties(prefix = "spring.datasource2") 

現在,您將在package1和package2中分別具有2個類似的RequestRepository1和RequestRepository2,如上所述(basePackages = {「com.package1.repo」})。

step4>全部設置autowire 2個不同的回購。

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

然後使用它們。

List<Request> listAdesioni = repo1.findByCodiceFiscale(codicefiscale); 
List<Request> listAdesioni = repo2.findByCodiceFiscale(codicefiscale); 
相關問題