迁移到 Spring Data JDBC 2.0

工程 | Jens Schauder | 2020年5月20日 | ...

在 Spring Data JDBC 2.0 中,我们不得不引入一些重大更改。本文旨在帮助您完成迁移过程。

TL;DR

  1. 对自定义列和表名使用默认大小写,或者对表生成中使用的名称进行引用,使其与注解中完全一致。

  2. 使用 AbstractJdbcConfiguration 自定义应用程序上下文的配置。

  3. 如果需要,注册一个 Dialect.

  4. 检查事件处理代码,并确保您尝试使用的数据不为 null

标识符的引用

Spring Data JDBC 1.x 主要是在不更改表名和列名的情况下使用它们。当您使用 SQL 关键字作为属性或实体名称,或者当您尝试在列名中使用某些特殊字符时,这会导致问题。

因此,Spring Data JDBC 2.0 默认情况下会引用所有标识符。这使得名称区分大小写,至少对于大多数数据库而言如此。由于我们默认情况下还会将生成的名称转换为数据库使用的默认大小写,因此这应该不会造成任何问题,假设您在 CREATE TABLE 语句中没有使用引号,大多数人都是这样做的。

例如,考虑以下 Student 实体

class Student {

    @Id
    Long id;
    String name;
}

H2 的匹配表可能如下所示

CREATE TABLE STUDENT
(
    ID SERIAL PRIMARY KEY,
    NAME  VARCHAR(30)
);

该示例与 Spring Data JDBC 的先前版本相同。当您使用 @Column@Table@MappedCollection 显式指定列名或表名时,情况就会发生变化。在这种情况下,我们假设您指定了名称,使其完全符合您希望使用的名称,因此表定义必须使用带引号的标识符,或者名称必须使用数据库的默认大小写,如以下修改后的学生示例所示

@Table("student")
class Student {

    @Id
    Long id;
    @Column("LAST_NAME")
    String name;
}

H2 的匹配表可能如下所示

CREATE TABLE "student" -- (1)
(
    ID SERIAL PRIMARY KEY,
    LAST_NAME  VARCHAR(30) -- (2)
);
  1. 表名必须加引号,因为它使用的是小写字母,但 H2 默认情况下会将未加引号的 SQL 标识符转换为大写。

  2. LAST_NAME 不必加引号,因为它已经使用了默认大小写。

请参阅下文,了解如何在您确实需要时禁用强制引用。

配置

如果您需要自定义 ApplicationContext 的配置,最简单的方法可能是继承自 org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration。其他具有类似名称且具有相同用途的类已被移除。

在从 AbstractJdbcConfiguration 继承的配置中,您可以覆盖例如 jdbcMappingContext,如下所示,以禁用 SQL 标识符的强制引用。

@Bean
@Override
public JdbcMappingContext jdbcMappingContext(Optional<NamingStrategy> namingStrategy, JdbcCustomConversions customConversions) {

	JdbcMappingContext mappingContext = super.jdbcMappingContext(namingStrategy, customConversions);
  mappingContext.setForceQuote(false);

	return mappingContext;
}

AggregateChangeDbAction 是不可变的

您可能在事件处理程序或回调方法中遇到过这些。它们过去是可变的,但这几乎不可能以有意义的方式使用。此外,实际上不可能以稳定的方式支持它。因此,它已在没有替换的情况下被移除。

如果您有实际更改这些实例的用例,请在我们的问题跟踪器中创建一个问题。

方言

Spring Data JDBC 现在有一个 Dialect 接口,并且对于完全支持的数据库,它附带了一个匹配的实现。

支持的数据库包括:

  • DB2

  • HSQLDB

  • H2

  • MySQL 和 MariaDB

  • Postgres

  • SQL Server

Oracle 支持目前正在 开发中

如果您使用的是其他数据库,则您的应用程序将无法启动。在这种情况下,您需要:

  1. 实现您自己的 Dialect

  2. 实现一个 JdbcDialectProvider,返回该 Dialect

  3. 通过将 spring.factories 文件放在类路径的 META-INF 文件夹中并添加行 org.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProvider=<您的 JdbcDialectProvider 的完整限定名称> 来注册提供程序。

在我们可以发布本文之前,有人已经在 Stack Overflow 上给出了一个 很棒的答案,说明如何做到这一点。

简化的事件

如果实体不可用(例如,对于删除事件),则事件仅提供实体的 ID。如果事件中存在实体,则 ID 的顺序不重要,以避免查找可能不会使用的值。以前使用 Optional 值的事件现在使用可空值。因此,您应该仔细检查您的事件侦听器。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部