Skip to content

11. PostgreSQL 9.4

Vamos agora abordar a adaptação para o PostgreSQL 9.4 do que foi feito com o Oracle.

11.1. Configuração do ambiente de trabalho

11.1.1. Ambiente Eclipse

Iremos trabalhar com o seguinte ambiente Eclipse:

  

Os projetos PostgreSQL acima referidos podem ser encontrados na pasta [<examples>/spring-database-config\postgresql\eclipse].

Nota: Prima [Alt-F5] para regenerar todos os projetos Maven.

11.1.2. Gerar as bases de dados

Ao longo do resto deste guia, as ligações às bases de dados PostgreSQL são feitas utilizando as credenciais [postgres / postgres]. Inicie o PostgreSQL e o seu cliente [PgManager] (consulte a secção 23.7).

  • Em [1], carregue o script SQL [<examples>\spring-database-config\postgresql\databases\dbproduits.sql];
  • Em [2], tal como no Oracle, as camadas JPA utilizam sequências para gerar chaves primárias. Aqui, a sequência [products_sequence] gera as chaves primárias para a tabela [products];

Agora, execute as configurações:

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

Todos devem ser aprovados.

Agora vamos gerar a base de dados [dbproduitscategories]. Repita o procedimento utilizado para criar [dbproduits] para [dbproduitscategories]. O script SQL a carregar encontra-se em [<examples>\spring-database-config\postgresql\databases\ dbproduitscategories.sql] ;

  

Agora, execute os testes:

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

Ambos devem ser aprovados.

11.2. Configurar a camada JDBC

 

O projeto [postgresql-config-jdbc] configura a camada [JDBC] da seguinte arquitetura de teste:

O projeto é análogo ao projeto de configuração [mysql-config-jdbc] para a camada JDBC do SGBD MySQL (ver Secção 3.3). Apresentamos apenas as alterações:

O ficheiro [pom.xml] importa o controlador JDBC do 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>
  • linhas 18–22: o controlador JDBC do PostgreSQL;

A segunda alteração está na classe [ConfigJdbc], que define as credenciais da base de dados:


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

A terceira modificação que pode ser feita diz respeito ao número máximo de parâmetros que um [PreparedStatement] pode suportar:


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

O teste [JUnitTestPushTheLimits] gera instruções SQL para 5.000 produtos, o que irá gerar objetos [PreparedStatement] com 5.000 parâmetros. O MySQL suportou este valor. O PostgreSQL também.

A quarta alteração é mais surpreendente:


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

Os nomes das colunas [ID] nas tabelas [CATEGORIES] e [PRODUCTS] devem estar em minúsculas para o projeto [spring-jdbc-04]. Caso contrário, ocorre uma falha nas instruções que utilizam os dois beans seguintes deste projeto:


    // 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. Configuração da camada JPA do OpenJPA

 

O projeto [postgresql-config-jpa-openjpa] configura a camada [JPA] da arquitetura de teste:

O projeto é análogo ao projeto de configuração [oracle-config-jpa-openjpa] para a camada JPA do OpenJpa do SGBD Oracle (ver Secção 10.5). Na verdade, ambos os SGBDs utilizam sequências para gerar chaves primárias. Há apenas uma alteração a fazer. Esta encontra-se na definição do bean [jpaVendorAdapter] na 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;
}
  • Linha 6: Indicamos à implementação JPA que irá trabalhar com uma base de dados PostgreSQL. A implementação JPA irá então adotar os tipos de dados e o SQL proprietários deste SGBD.

Com estas alterações efetuadas, a execução da configuração [spring-jpa-generic-JUnitTestDao-openjpa] deverá ser bem-sucedida.

11.4. Configurar a camada JPA do Hibernate

 

Nota: Prima [Alt-F5] para regenerar todos os projetos Maven.

O projeto [postgresql-config-jpa-hibernate] é análogo ao projeto [oracle-config-jpa-hibernate] (Secção 10.4), com as mesmas modificações que foram utilizadas para portar o projeto [oracle-config-jpa-openjpa] para o projeto [postgresql-config-jpa-openjpa] (Secção 11.3).

Com estas modificações implementadas, a execução da configuração [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] deverá ser bem-sucedida.

 

Nota: Prima [Alt-F5] para regenerar todos os projetos Maven.

O projeto [postgresql-config-jpa-eclipselink] é análogo ao [oracle-config-jpa-eclipselink] (Secção 10.3), com as mesmas modificações que foram utilizadas para portar o projeto [oracle-config-jpa-openjpa] para o projeto [postgresql-config-jpa-openjpa] (Secção 11.3).

Com estas modificações implementadas, a execução da configuração [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] deverá ser bem-sucedida.