2017-10-18 10 views
1

J'ai un projet Spring Boot avec une entité et un référentiel associés à cette entité. Dans le référentiel, il existe une méthode avec une requête personnalisée et dans le contrôleur de projet, ce référentiel est utilisé pour renvoyer des données de différentes bases de données postgresql. Ces bases de données ont les mêmes tables avec les mêmes colonnes (donc l'entité référencée est la même), la seule différence entre ces bases de données est l'année (..., DB2015, DB2016, DB2017). Mes questions sont: Comment puis-je retourner des données dans le contrôleur de projet qui appartiennent à des bases de données "différentes"? Est-il possible d'utiliser la même requête pour sélectionner des données initialement à partir de la première base de données, puis à partir de la seconde et ainsi de suite? Dans d'autres questions, j'ai lu que j'avais besoin de sources de données différentes, est-ce correct?Spring Boot - Même référentiel et même entité pour différentes bases de données

Ceci est l'entité:

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

} 

Ceci est le dépôt:

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

} 

Ceci est le contrôleur

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

Ceci est application.properties (dans ce cas, la source de données est référé à un db uniquement):

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

tout espoir est clair

+0

Vous pouvez définir plusieurs 'LocalContainerEntityManagerFactoryBean'beans avec chacun le datasource associé à la base de données voulue. – mrkernelpanic

Répondre

1

Créer 2 fichiers de configuration avec différents et ces 2 datasource fichiers de configuration auront des spécifications différentes pour 2 différentes class.but de dépôt JPA peut avoir la même classe de domaine.

step1> Dans le fichier de propriétés, vous avez 2 informations sur la source de données.

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 

Etape 2> Créez ensuite le fichier de configuration pour la première 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); 
    } 
} 

étape3> similairement créer un autre fichier de configuration pour les autres dataSource,

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

Et le changement préfixe

@ConfigurationProperties(prefix = "spring.datasource2") 

Maintenant, vous aurez 2 RequestRepository1 et RequestRepository2 similaires dans package1 et package2 respectivement comme mentionné ci-dessus (basePackages = {"com.package1.repo"}).

step4> Tous ensemble autowire 2 repo différent.

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

Ensuite, utilisez-les.

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