Skip to content

11. PostgreSQL 9.4

Przechodzimy teraz do przeniesienia na wersję PostgreSQL 9.4 tego, co zostało zrobione w przypadku Oracle.

11.1. Konfiguracja środowiska pracy

11.1.1. Środowisko Eclipse

Będziemy pracować w następującym środowisku Eclipse:

  

Powyższe projekty PostgreSQL znajdują się w folderze [<exemples>/spring-database-config\postgresql\eclipse].

Uwaga: należy uruchomić polecenie [Alt-F5], aby ponownie wygenerować wszystkie projekty Maven.

11.1.2. Generowanie baz danych

W dalszej części połączenie z bazami danych PostgresSQL odbywa się przy użyciu danych logowania [postgres / postgres]. Uruchom PostgreSQL oraz jego klienta [PgManager] (patrz punkt 23.7).

  • w pliku [1] zostanie załadowany skrypt SQL [<exemples>\spring-database-config\postgresql\databases\dbproduits.sql];
  • do [2]; podobnie jak w przypadku Oracle, warstwy JPA wykorzystują sekwencje do generowania kluczy głównych. W tym przypadku sekwencja [produits_sequence] generuje klucze główne tabeli [produits];

Teraz należy wykonać następujące konfiguracje:

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

Wszystkie powinny zakończyć się powodzeniem.

Wygenerujmy teraz bazę [dbproduitscategories]. Powtórz dla [dbproduitscategories] procedurę przeprowadzoną w celu utworzenia [dbproduits]. Skrypt SQL, który należy załadować, znajduje się w lokalizacji [<exemples>\spring-database-config\postgresql\databases\ dbproduitscategories.sql];

  

Teraz należy wykonać następujące konfiguracje:

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

Obie powinny zakończyć się powodzeniem.

11.2. Konfiguracja warstwy JDBC

 

Projekt [postgresql-config-jdbc] konfiguruje warstwę [JDBC] w następującej architekturze testowej:

Projekt ten jest analogiczny do projektu konfiguracyjnego [mysql-config-jdbc] warstwy JDBC w ramach SGBD MySQL (patrz punkt 3.3). Przedstawiamy jedynie zmiany:

Plik [pom.xml] importuje sterownik JDBC z pliku 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>
        <!-- zmienne zależności ********************************************** -->
        <!-- sterownik JDBC dla SGBD -->
        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.1-901-1.jdbc4</version>
        </dependency>        
      <!-- stałe zależności ********************************************** -->
        ...
    </dependencies>
...
</project>
  • wiersze 18–22: sterownik JDBC z pliku PostgreSQL;

Druga zmiana dotyczy klasy [ConfigJdbc], która definiuje identyfikatory dostępu do baz danych:


    // parametry połączenia
    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";

Trzecią zmianą, jaką można wprowadzić, jest zmiana maksymalnej liczby parametrów, które może obsłużyć [PreparedStatement]:


    // maksymalna liczba parametrów dla [PreparedStatement]
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 10000;

Test [JUnitTestPushTheLimits] generuje zlecenia SQL dla 5000 produktów, które z kolei wygenerują pliki [PreparedStatement] zawierające 5000 parametrów. MySQL obsłużył tę wartość. Podobnie jak PostgreSQL.

Czwarta zmiana jest bardziej zaskakująca:


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

Nazwy kolumn [ID] w tabelach [CATEGORIES] i [PRODUITS] muszą być zapisane małymi literami w projekcie [spring-jdbc-04]. W przeciwnym razie dochodzi do awarii instrukcji wykorzystujących następujące dwa komponenty tego projektu:


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

    // dodawanie kategorii
    @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. Konfiguracja warstwy JPA OpenJpa

 

Projekt [postgresql-config-jpa-openjpa] konfiguruje warstwę [JPA] architektury testowej:

Projekt ten jest analogiczny do projektu konfiguracyjnego [oracle-config-jpa-openjpa] warstwy JPA OpenJpa w Oracle SGBD (patrz paragraf 10.5). W rzeczywistości oba projekty SGBD wykorzystują sekwencje do generowania kluczy głównych. Należy wprowadzić tylko jedną zmianę. Znajduje się ona w definicji komponentu [jpaVendorAdapter] klasy [ConfigJpa]:


    // dostawca JPA
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
        openJpaVendorAdapter.setShowSql(false);
        openJpaVendorAdapter.setDatabase(Database.POSTGRESQL);
        openJpaVendorAdapter.setGenerateDdl(true);
        return openJpaVendorAdapter;
}
  • wiersz 6: informujemy implementację JPA, że będzie ona współpracować z bazą PostgreSQL. Implementacja JPA przejmie wówczas zarówno własne typy danych, jak i implementację SQL, która jest właścicielem tej implementacji SGBD.

Po wprowadzeniu tych zmian uruchomienie konfiguracji [spring-jpa-generic-JUnitTestDao-openjpa] powinno zakończyć się powodzeniem.

11.4. Konfiguracja warstwy Hibernate o numerze JPA

 

Uwaga: należy wykonać polecenie [Alt-F5], aby ponownie wygenerować wszystkie projekty Maven.

Projekt [postgresql-config-jpa-hibernate] jest analogiczny do projektu [oracle-config-jpa-hibernate] (punkt 10.4) i zawiera te same modyfikacje, które miały zastosowanie podczas przenoszenia projektu [oracle-config-jpa-openjpa] do projektu [postgresql-config-jpa-openjpa] (punkt 11.3).

Po wprowadzeniu tych zmian konfiguracja [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] powinna zakończyć się powodzeniem.

 

Uwaga: należy uruchomić [Alt-F5], aby ponownie wygenerować wszystkie projekty Maven.

Projekt [postgresql-config-jpa-eclipselink] jest analogiczny do projektu [oracle-config-jpa-eclipselink] (punkt 10.3) i zawiera te same modyfikacje, które miały zastosowanie przy przenoszeniu projektu [oracle-config-jpa-openjpa] do projektu [postgresql-config-jpa-openjpa] (punkt 11.3).

Po wprowadzeniu tych zmian uruchomienie konfiguracji [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] powinno zakończyć się powodzeniem.