Skip to content

11. PostgreSQL 9.4

Wir wenden uns nun der Portierung der mit Oracle durchgeführten Maßnahmen auf PostgreSQL 9.4 zu.

11.1. Einrichtung der Arbeitsumgebung

11.1.1. Eclipse-Umgebung

Wir werden mit der folgenden Eclipse-Umgebung arbeiten:

  

Die oben genannten Projekte PostgreSQL befinden sich im Ordner [<exemples>/spring-database-config\postgresql\eclipse].

Hinweis: Führen Sie „[Alt-F5]“ aus, um alle Maven-Projekte neu zu generieren.

11.1.2. Erstellung der Datenbanken

Im weiteren Verlauf erfolgt die Verbindung zu den Datenbanken PostgresSQL mit den Anmeldedaten [postgres / postgres]. Starten Sie PostgreSQL und dessen Client [PgManager] (siehe Abschnitt 23.7).

  • Bei [1] wird das Skript SQL [<exemples>\spring-database-config\postgresql\databases\dbproduits.sql] geladen;
  • in [2]; wie bei Oracle verwenden die Ebenen JPA Sequenzen zur Generierung der Primärschlüssel. Hier generiert die Sequenz [produits_sequence] die Primärschlüssel der Tabelle [produits];

Führen Sie nun die folgenden Konfigurationen aus:

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

Sie müssen alle erfolgreich sein.

Erstellen wir nun die Datenbank [dbproduitscategories]. Wiederholen Sie für [dbproduitscategories] den Vorgang, der zur Erstellung von [dbproduits] durchgeführt wurde. Das zu ladende Skript SQL befindet sich unter [<exemples>\spring-database-config\postgresql\databases\ dbproduitscategories.sql];

  

Führen Sie nun die folgenden Konfigurationen aus:

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

Beide müssen erfolgreich sein.

11.2. Konfiguration der Schicht JDBC

 

Das Projekt [postgresql-config-jdbc] konfiguriert die Schicht [JDBC] der folgenden Testarchitektur:

Das Projekt entspricht dem Konfigurationsprojekt [mysql-config-jdbc] der Schicht JDBC des SGBD MySQL (siehe Abschnitt 3.3). Wir stellen hier nur die Änderungen vor:

Die Datei [pom.xml] importiert den Treiber JDBC aus 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>
        <!-- Variable Abhängigkeiten ********************************************** -->
        <!-- Treiber JDBC von SGBD -->
        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.1-901-1.jdbc4</version>
        </dependency>        
      <!-- konstante Abhängigkeiten ********************************************** -->
        ...
    </dependencies>
...
</project>
  • Zeilen 18–22: den Treiber JDBC aus PostgreSQL;

Die zweite Änderung befindet sich in der Klasse [ConfigJdbc], die die Zugangs-IDs für die Datenbanken definiert:


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

Die dritte Änderung, die vorgenommen werden kann, betrifft die maximale Anzahl von Parametern, die ein [PreparedStatement] unterstützen kann:


    // Maximale Anzahl von Parametern eines [PreparedStatement]
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 10000;

Der Test [JUnitTestPushTheLimits] generiert SQL-Aufträge für 5.000 Produkte, die wiederum [PreparedStatement] mit 5.000 Parametern erzeugen. MySQL hatte diesen Wert bereits unterstützt. PostgreSQL ebenfalls.

Die vierte Änderung ist noch überraschender:


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

Die Spaltennamen [ID] der Tabellen [CATEGORIES] und [PRODUITS] müssen im Projekt [spring-jdbc-04] in Kleinbuchstaben geschrieben sein. Andernfalls kommt es bei Anweisungen, die die beiden folgenden Beans dieses Projekts verwenden, zu einem Absturz:


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

    // Kategorie einfügen
    @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. Konfiguration der Schicht JPA OpenJpa

 

Das Projekt [postgresql-config-jpa-openjpa] konfiguriert die Schicht [JPA] der Testarchitektur:

Das Projekt entspricht dem Konfigurationsprojekt [oracle-config-jpa-openjpa] der Schicht JPA OpenJpa von Oracle SGBD (siehe Abschnitt 10.5). Tatsächlich verwenden beide SGBD-Projekte Sequenzen zur Generierung der Primärschlüssel. Es ist lediglich eine Änderung vorzunehmen. Diese befindet sich in der Definition des Beans [jpaVendorAdapter] der Klasse [ConfigJpa]:


    // Der Provider JPA
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
        openJpaVendorAdapter.setShowSql(false);
        openJpaVendorAdapter.setDatabase(Database.POSTGRESQL);
        openJpaVendorAdapter.setGenerateDdl(true);
        return openJpaVendorAdapter;
}
  • Zeile 6: Der Implementierung JPA wird mitgeteilt, dass sie mit einer Datenbank PostgreSQL arbeiten soll. Die Implementierung JPA übernimmt dann sowohl die proprietären Datentypen als auch die proprietäre SQL dieser SGBD.

Nach diesen Änderungen sollte die Ausführung der Konfiguration [spring-jpa-generic-JUnitTestDao-openjpa] erfolgreich sein.

11.4. Konfiguration der Hibernate-Schicht JPA

 

Hinweis: Führen Sie den Befehl [Alt-F5] aus, um alle Maven-Projekte neu zu generieren.

Das Projekt [postgresql-config-jpa-hibernate] entspricht dem Projekt [oracle-config-jpa-hibernate] (Absatz 10.4) und weist dieselben Änderungen auf, die bei der Portierung von [oracle-config-jpa-openjpa] auf das Projekt [postgresql-config-jpa-openjpa] (Absatz 11.3) vorgenommen wurden.

Nach Durchführung dieser Änderungen sollte die Ausführung der Konfiguration [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] erfolgreich sein.

 

Hinweis: Führen Sie [Alt-F5] aus, um alle Maven-Projekte neu zu generieren.

Das Projekt [postgresql-config-jpa-eclipselink] entspricht dem Projekt [oracle-config-jpa-eclipselink] (Abschnitt 10.3) und weist dieselben Änderungen auf, die bei der Portierung von [oracle-config-jpa-openjpa] auf das Projekt [postgresql-config-jpa-openjpa] (Abschnitt 11.3) vorgenommen wurden.

Nach Durchführung dieser Änderungen sollte die Ausführung der Konfiguration [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] erfolgreich sein.