11. PostgreSQL 9.4
接下来,我们将针对此前针对 Oracle 所做的工作,探讨将其移植到 PostgreSQL 9.4 的方案。
![]() |
11.1. 配置工作环境
11.1.1. Eclipse 环境
我们将使用以下 Eclipse 环境:
![]() |
上述 PostgreSQL 项目位于 [<examples>/spring-database-config\postgresql\eclipse] 文件夹中。
注意:按 [Alt-F5] 可重新生成所有 Maven 项目。
11.1.2. 生成数据库
在本指南的其余部分中,连接 PostgreSQL 数据库将使用凭据 [postgres / postgres]。启动 PostgreSQL 及其客户端 [PgManager](参见第 23.7 节)。
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() | ![]() |
![]() |
- 在 [1] 中,加载 SQL 脚本 [<examples>\spring-database-config\postgresql\databases\dbproduits.sql];
![]() | ![]() |
![]() |
- 在[2]中,与Oracle类似,JPA层使用序列来生成主键。在此,序列[products_sequence]为[products]表生成主键;
现在,运行配置:
- [spring-jdbc-generic-01.IntroJdbc01];
- [spring-jdbc-generic-01.IntroJdbc02];
- [spring-jdbc-generic-03.JUnitTestDao1];
- [spring-jdbc-generic-03.JUnitTestDao2];
它们都应该通过。
现在让我们生成 [dbproduitscategories] 数据库。对 [dbproduitscategories] 重复创建 [dbproduits] 时所用的步骤。要加载的 SQL 脚本位于 [<examples>\spring-database-config\postgresql\databases\ dbproduitscategories.sql];
![]() |
现在,运行测试:
- [spring-jdbc-generic-04.JUnitTestDao];
- [spring-jpa-generic-JUnitTestDao-openjpa];
两者都应通过。
11.2. 配置 JDBC 层
![]() | ![]() |
[postgresql-config-jdbc] 项目配置了以下测试架构的 [JDBC] 层:
![]() |
该项目类似于针对 MySQL 数据库管理系统 (DBMS) JDBC 层的 [mysql-config-jdbc] 配置项目(参见第 3.3 节)。此处仅列出变更内容:
[pom.xml] 文件引入了 PostgreSQL JDBC 驱动程序:
<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>
- 第 18–22 行:PostgreSQL JDBC 驱动程序;
第二个改动位于 [ConfigJdbc] 类中,该类定义了数据库凭据:
// 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";
可以进行的第三项修改是调整 [PreparedStatement] 支持的参数最大数量:
// max number of parameters of a [PreparedStatement]
public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 10000;
[JUnitTestPushTheLimits] 测试会为 5,000 种产品生成 SQL 语句,这将生成包含 5,000 个参数的 [PreparedStatement] 对象。MySQL 支持此参数数量。PostgreSQL 同样支持。
第四个变化更令人惊讶:
public final static String TAB_PRODUITS_ID = "id";
public final static String TAB_CATEGORIES_ID = "id";
对于 [spring-jdbc-04] 项目,[CATEGORIES] 和 [PRODUCTS] 表中的 [ID] 列名称必须为小写。否则,在使用该项目中以下两个 Bean 的语句时会发生崩溃:
// 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. OpenJPA JPA 层的配置
![]() | ![]() |
[postgresql-config-jpa-openjpa] 项目负责配置测试架构的 [JPA] 层:
![]() |
该项目类似于针对 Oracle 数据库管理系统 (DBMS) 的 OpenJpa JPA 层的 [oracle-config-jpa-openjpa] 配置项目(参见第 10.5 节)。事实上,这两种 DBMS 都使用序列来生成主键。只需进行一项修改,即在 [ConfigJpa] 类中对 [jpaVendorAdapter] Bean 的定义进行调整:
// the provider JPA
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
openJpaVendorAdapter.setShowSql(false);
openJpaVendorAdapter.setDatabase(Database.POSTGRESQL);
openJpaVendorAdapter.setGenerateDdl(true);
return openJpaVendorAdapter;
}
- 第 6 行:我们告知 JPA 实现,它将与 PostgreSQL 数据库进行交互。随后,JPA 实现将采用该数据库管理系统(DBMS)专有的数据类型和 SQL 语句。
完成这些修改后,运行 [spring-jpa-generic-JUnitTestDao-openjpa] 配置应能成功。
![]() | ![]() |
11.4. 配置 Hibernate JPA 层
![]() | ![]() |
注意:按 [Alt-F5] 可重新生成所有 Maven 项目。
[postgresql-config-jpa-hibernate] 项目与 [oracle-config-jpa-hibernate] 项目(第 10.4 节)类似,采用了与将 [oracle-config-jpa-openjpa] 项目移植到 [postgresql-config-jpa-openjpa] 项目(第 11.3 节)时相同的修改。
完成这些修改后,[spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] 配置的执行应能成功。
11.5. 配置 EclipseLink JPA 层
![]() | ![]() |
注意:按 [Alt-F5] 可重新生成所有 Maven 项目。
[postgresql-config-jpa-eclipselink] 项目与 [oracle-config-jpa-eclipselink](第 10.3 节)类似,采用了与将 [oracle-config-jpa-openjpa] 项目移植到 [postgresql-config-jpa-openjpa] 项目(第 11.3 节)时相同的修改。
完成这些修改后,[spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] 配置的执行应能成功。



























