Skip to content

11. PostgreSQL 9.4

Affronteremo ora il porting su PostgreSQL 9.4 di quanto è stato realizzato con Oracle.

11.1. Configurazione dell'ambiente di lavoro

11.1.1. Ambiente Eclipse

Lavoreremo con il seguente ambiente Eclipse:

  

I progetti PostgreSQL sopra elencati si trovano nella cartella [<examples>/spring-database-config\postgresql\eclipse].

Nota: premere [Alt-F5] per rigenerare tutti i progetti Maven.

11.1.2. Generazione dei database

Nel resto di questa guida, le connessioni ai database PostgreSQL vengono effettuate utilizzando le credenziali [postgres / postgres]. Avviare PostgreSQL e il suo client [PgManager] (vedere la sezione 23.7).

  • In [1], caricare lo script SQL [<examples>\spring-database-config\postgresql\databases\dbproduits.sql];
  • In [2], come in Oracle, i livelli JPA utilizzano sequenze per generare le chiavi primarie. In questo caso, la sequenza [products_sequence] genera le chiavi primarie per la tabella [products];

Ora, esegui le configurazioni:

  • [spring-jdbc-generic-01.IntroJdbc01];
  • [spring-jdbc-generic-01.IntroJdbc02];
  • [spring-jdbc-generic-03.JUnitTestDao1];
  • [spring-jdbc-generic-03.JUnitTestDao2];

Dovrebbero superare tutti i test.

Ora generiamo il database [dbproduitscategories]. Ripetiamo la procedura utilizzata per creare [dbproduits] per [dbproduitscategories]. Lo script SQL da caricare si trova in [<examples>\spring-database-config\postgresql\databases\ dbproduitscategories.sql] ;

  

Ora, esegui i test:

  • [spring-jdbc-generic-04.JUnitTestDao];
  • [spring-jpa-generic-JUnitTestDao-openjpa];

Entrambi dovrebbero superare il test.

11.2. Configurazione del livello JDBC

 

Il progetto [postgresql-config-jdbc] configura il livello [JDBC] della seguente architettura di test:

Il progetto è analogo al progetto di configurazione [mysql-config-jdbc] per il livello JDBC del DBMS MySQL (vedere la Sezione 3.3). Presentiamo solo le modifiche:

Il file [pom.xml] importa il driver JDBC di PostgreSQL:


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>dvp.spring.database</groupId>
    <artifactId>generic-config-jdbc</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>configuration generic jdbc</name>
 
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.3.RELEASE</version>
    </parent>
 
    <dependencies>
        <!-- dépendances variables ********************************************** -->
        <!-- driver JDBC from SGBD -->
        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.1-901-1.jdbc4</version>
        </dependency>        
      <!-- dépendances constantes ********************************************** -->
        ...
    </dependencies>
...
</project>
  • righe 18–22: il driver JDBC di PostgreSQL;

La seconda modifica riguarda la classe [ConfigJdbc], che definisce le credenziali del database:


    // paramètres de connexion
    public final static String DRIVER_CLASSNAME = "org.postgresql.Driver";
    public final static String URL_DBPRODUITS = "jdbc:postgresql:dbproduits";
    public final static String USER_DBPRODUITS = "postgres";
    public final static String PASSWD_DBPRODUITS = "postgres";
    public final static String URL_DBPRODUITSCATEGORIES = "jdbc:postgresql:dbproduitscategories";
    public final static String USER_DBPRODUITSCATEGORIES = "postgres";
public final static String PASSWD_DBPRODUITSCATEGORIES = "postgres";

La terza modifica che è possibile apportare riguarda il numero massimo di parametri che un [PreparedStatement] può supportare:


    // max number of parameters of a [PreparedStatement]
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 10000;

Il test [JUnitTestPushTheLimits] genera istruzioni SQL per 5.000 prodotti, il che genererà oggetti [PreparedStatement] con 5.000 parametri. MySQL supportava questo valore. Anche PostgreSQL lo supportava.

La quarta modifica è più sorprendente:


public final static String TAB_PRODUITS_ID = "id";
public final static String TAB_CATEGORIES_ID = "id";    

I nomi delle colonne [ID] nelle tabelle [CATEGORIES] e [PRODUCTS] devono essere in minuscolo per il progetto [spring-jdbc-04]. In caso contrario, si verifica un crash nelle istruzioni che utilizzano i seguenti due bean di questo progetto:


    // product insertion
    @Bean
    public SimpleJdbcInsert simpleJdbcInsertProduit(DataSource dataSource) {
        return new SimpleJdbcInsert(dataSource)
                .withTableName(ConfigJdbc.TAB_PRODUITS)
                .usingGeneratedKeyColumns(ConfigJdbc.TAB_PRODUITS_ID)
                .usingColumns(ConfigJdbc.TAB_PRODUITS_NOM, ConfigJdbc.TAB_PRODUITS_PRIX, ConfigJdbc.TAB_PRODUITS_DESCRIPTION,
                        ConfigJdbc.TAB_PRODUITS_CATEGORIE_ID);
    }
 
    // insertion category
    @Bean
    public SimpleJdbcInsert simpleJdbcInsertCategorie(DataSource dataSource) {
        return new SimpleJdbcInsert(dataSource).withTableName(ConfigJdbc.TAB_CATEGORIES)
                .usingGeneratedKeyColumns(ConfigJdbc.TAB_CATEGORIES_ID)
                .usingColumns(ConfigJdbc.TAB_CATEGORIES_NOM);
}

11.3. Configurazione del livello JPA di OpenJPA

 

Il progetto [postgresql-config-jpa-openjpa] configura il livello [JPA] dell'architettura di test:

Il progetto è analogo al progetto di configurazione [oracle-config-jpa-openjpa] per il livello JPA OpenJpa del DBMS Oracle (vedere la Sezione 10.5). Infatti, entrambi i DBMS utilizzano sequenze per generare chiavi primarie. C'è solo una modifica da apportare. Si trova nella definizione del bean [jpaVendorAdapter] nella classe [ConfigJpa]:


    // the provider JPA
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
        openJpaVendorAdapter.setShowSql(false);
        openJpaVendorAdapter.setDatabase(Database.POSTGRESQL);
        openJpaVendorAdapter.setGenerateDdl(true);
        return openJpaVendorAdapter;
}
  • Riga 6: Indichiamo all'implementazione JPA che lavorerà con un database PostgreSQL. L'implementazione JPA adotterà quindi i tipi di dati proprietari e il linguaggio SQL di questo DBMS.

Una volta apportate queste modifiche, l'esecuzione della configurazione [spring-jpa-generic-JUnitTestDao-openjpa] dovrebbe avere esito positivo.

11.4. Configurazione del livello JPA di Hibernate

 

Nota: premere [Alt-F5] per rigenerare tutti i progetti Maven.

Il progetto [postgresql-config-jpa-hibernate] è analogo al progetto [oracle-config-jpa-hibernate] (Sezione 10.4) con le stesse modifiche utilizzate per portare il progetto [oracle-config-jpa-openjpa] al progetto [postgresql-config-jpa-openjpa] (Sezione 11.3).

Una volta apportate queste modifiche, l'esecuzione della configurazione [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] dovrebbe avere esito positivo.

 

Nota: premere [Alt-F5] per rigenerare tutti i progetti Maven.

Il progetto [postgresql-config-jpa-eclipselink] è analogo al progetto [oracle-config-jpa-eclipselink] (Sezione 10.3) con le stesse modifiche utilizzate per portare il progetto [oracle-config-jpa-openjpa] al progetto [postgresql-config-jpa-openjpa] (Sezione 11.3).

Una volta apportate queste modifiche, l'esecuzione della configurazione [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] dovrebbe avere esito positivo.