11. PostgreSQL 9.4
现在,我们将讨论如何将 Oracle 上的工作移植到 PostgreSQL 9.4 上。
![]() |
11.1. 工作环境的搭建
11.1.1. Eclipse 环境
我们将使用以下 Eclipse 环境:
![]() |
上述 PostgreSQL 项目位于 [<exemples>/spring-database-config\postgresql\eclipse] 文件夹中。
注意:执行 [Alt-F5] 可重新生成所有 Maven 项目。
11.1.2. 数据库生成
在后续操作中,连接 PostgresSQL 数据库需使用 [postgres / postgres] 的凭据。请启动 PostgreSQL 及其客户端 [PgManager](参见第 23.7 节)。
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() | ![]() |
![]() |
- 在 [1] 中,将加载脚本 SQL [<exemples>\spring-database-config\postgresql\databases\dbproduits.sql];
![]() | ![]() |
![]() |
- 到 [2] 中,与 Oracle 类似,JPA 层使用序列来生成主键。 在此,序列 [produits_sequence] 生成表 [produits] 的主键;
现在,执行以下配置:
- [spring-jdbc-generic-01.IntroJdbc01];
- [spring-jdbc-generic-01.IntroJdbc02];
- [spring-jdbc-generic-03.JUnitTestDao1];
- [spring-jdbc-generic-03.JUnitTestDao2];
所有配置都应成功。
现在生成数据库 [dbproduitscategories]。请针对 [dbproduitscategories] 重复执行创建 [dbproduits] 时所用的步骤。 待加载的脚本 SQL 位于 [<exemples>\spring-database-config\postgresql\databases\ dbproduitscategories.sql] 位置;
![]() |
现在,执行以下配置:
- [spring-jdbc-generic-04.JUnitTestDao];
- [spring-jpa-generic-JUnitTestDao-openjpa];
这两项配置都应成功。
11.2. JDBC 配置
![]() | ![]() |
项目 [postgresql-config-jdbc] 配置了以下测试架构中的 [JDBC] 层:
![]() |
该项目与 SGBD 中的 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>
<!-- 可变依赖项 ********************************************** -->
<!-- SGBD 的驱动程序 JDBC -->
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>
</dependency>
<!-- 常量依赖项 ********************************************** -->
...
</dependencies>
...
</project>
- 第 18-22 行:JDBC 驱动程序(源自 PostgreSQL);
第二个修改位于定义数据库访问凭据的类 [ConfigJdbc] 中:
// 连接参数
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] 所能支持的参数最大数量:
// [PreparedStatement] 的最大参数数
public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 10000;
[JUnitTestPushTheLimits]测试会在5000种产品上生成SQL订单,这些订单将生成包含5000个参数的[PreparedStatement]。MySQL此前已支持该参数数量。 PostgreSQL 同样支持该值。
第四项修改更令人惊讶:
public final static String TAB_PRODUITS_ID = "id";
public final static String TAB_CATEGORIES_ID = "id";
在项目 [spring-jdbc-04] 中,表 [CATEGORIES] 和 [PRODUITS] 中的列名 [ID] 必须使用小写。 否则,在执行使用该项目中以下两个Bean的语句时会发生崩溃:
// 产品插入
@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);
}
// 分类添加
@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. JPA 层的配置 OpenJpa
![]() | ![]() |
项目 [postgresql-config-jpa-openjpa] 配置了测试架构中的 [JPA] 层:
![]() |
该项目与 Oracle SGBD 架构中 JPA 层的配置项目 [oracle-config-jpa-openjpa] 类似(参见第 10.5 节)。 实际上,这两个 SGBD 项目都使用序列来生成主键。只需进行一项修改。该修改位于 [ConfigJpa] 类的 [jpaVendorAdapter] Bean 定义中:
// 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 实现将采用该 SGBD 的专有数据类型以及其所属的 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. JPA 层的配置 EclipseLink
![]() | ![]() |
注:执行 [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] 的配置执行应能成功。



























