Skip to content

11. PostgreSQL 9.4

We gaan nu over tot de port naar PostgreSQL 9.4 van wat er met Oracle is gedaan.

11.1. Het opzetten van de werkomgeving

11.1.1. Eclipse-omgeving

We gaan werken met de volgende Eclipse-omgeving:

  

De bovenstaande projecten PostgreSQL zijn te vinden in de map [<exemples>/spring-database-config\postgresql\eclipse].

Opmerking: voer [Alt-F5] uit om alle Maven-projecten opnieuw te genereren.

11.1.2. Databases genereren

In het verdere verloop wordt de verbinding met de PostgresSQL-databases tot stand gebracht met de inloggegevens van [postgres / postgres]. Start PostgreSQL en de bijbehorende client [PgManager] (zie paragraaf 23.7).

  • in [1] wordt het script SQL [<exemples>\spring-database-config\postgresql\databases\dbproduits.sql] geladen;
  • in [2]; net als bij Oracle gebruiken de lagen JPA reeksen om de primaire sleutels te genereren. Hier genereert de sequentie [produits_sequence] de primaire sleutels van de tabel [produits];

Voer nu de configuraties uit:

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

Ze moeten allemaal slagen.

Laten we nu de basis [dbproduitscategories] genereren. Herhaal voor [dbproduitscategories] de procedure die is uitgevoerd om [dbproduits] aan te maken. Het te laden script SQL bevindt zich op de locatie [<exemples>\spring-database-config\postgresql\databases\ dbproduitscategories.sql] ;

  

Voer nu de configuraties uit:

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

Ze moeten allebei slagen.

11.2. Configuratie van de laag JDBC

 

Het project [postgresql-config-jdbc] configureert de laag [JDBC] van de volgende testarchitectuur:

Het project is vergelijkbaar met het configuratieproject [mysql-config-jdbc] van de laag JDBC van de SGBD MySQL (zie paragraaf 3.3). We geven hier alleen de wijzigingen weer:

Het bestand [pom.xml] importeert de driver JDBC uit 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>
        <!-- variabele afhankelijkheden ********************************************** -->
        <!-- stuurprogramma JDBC van SGBD -->
        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.1-901-1.jdbc4</version>
        </dependency>        
      <!-- constante afhankelijkheden ********************************************** -->
        ...
    </dependencies>
...
</project>
  • regels 18-22: de driver JDBC uit PostgreSQL;

De tweede wijziging bevindt zich in de klasse [ConfigJdbc], die de toegangsgegevens voor de databases definieert:


    // verbindingsparameters
    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";

De derde wijziging die kan worden aangebracht, betreft het maximale aantal parameters dat een [PreparedStatement] kan ondersteunen:


    // maximaal aantal parameters van een [PreparedStatement]
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 10000;

De test [JUnitTestPushTheLimits] genereert SQL-opdrachten voor 5000 producten, die op hun beurt [PreparedStatement]-opdrachten met 5000 parameters zullen genereren. MySQL ondersteunde deze waarde. PostgreSQL eveneens.

De vierde wijziging is nog verrassender:


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

De kolomnamen [ID] van de tabellen [CATEGORIES] en [PRODUITS] moeten in kleine letters worden geschreven voor het project [spring-jdbc-04]. Anders treedt er een crash op bij instructies die gebruikmaken van de volgende twee beans van dit project:


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

    // categorie toevoegen
    @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. Configuratie van de laag JPA OpenJpa

 

Het project [postgresql-config-jpa-openjpa] configureert de laag [JPA] van de testarchitectuur:

Het project is vergelijkbaar met het configuratieproject [oracle-config-jpa-openjpa] van de laag JPA OpenJpa van de Oracle SGBD (zie paragraaf 10.5). Beide SGBD-projecten maken namelijk gebruik van sequenties om de primaire sleutels te genereren. Er hoeft slechts één wijziging te worden aangebracht. Deze bevindt zich in de definitie van de bean [jpaVendorAdapter] van de klasse [ConfigJpa]:


    // de provider JPA
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
        openJpaVendorAdapter.setShowSql(false);
        openJpaVendorAdapter.setDatabase(Database.POSTGRESQL);
        openJpaVendorAdapter.setGenerateDdl(true);
        return openJpaVendorAdapter;
}
  • regel 6: de implementatie JPA wordt geïnformeerd dat deze met een database PostgreSQL gaat werken. De implementatie JPA neemt vervolgens zowel de eigen gegevenstypen als de eigen SQL van deze SGBD over.

Zodra deze wijzigingen zijn doorgevoerd, zou de uitvoering van de configuratie [spring-jpa-generic-JUnitTestDao-openjpa] moeten slagen.

11.4. Configuratie van de Hibernate-laag JPA

 

Opmerking: voer [Alt-F5] uit om alle Maven-projecten opnieuw te genereren.

Het project [postgresql-config-jpa-hibernate] is vergelijkbaar met het project [oracle-config-jpa-hibernate] (paragraaf 10.4) en bevat dezelfde wijzigingen die ten grondslag lagen aan de overzetting van [oracle-config-jpa-openjpa] naar het project [postgresql-config-jpa-openjpa] (paragraaf 11.3).

Als deze wijzigingen zijn doorgevoerd, zou de uitvoering van de configuratie [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] moeten slagen.

 

Opmerking: voer [Alt-F5] uit om alle Maven-projecten opnieuw te genereren.

Het project [postgresql-config-jpa-eclipselink] is vergelijkbaar met het project [oracle-config-jpa-eclipselink] (paragraaf 10.3) met dezelfde aanpassingen die zijn doorgevoerd bij de overzetting van [oracle-config-jpa-openjpa] naar het project [postgresql-config-jpa-openjpa] (paragraaf 11.3).

Als deze wijzigingen zijn doorgevoerd, zou de uitvoering van de configuratie [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] moeten slagen.