Spring Boot 升级到Sping Boot 2.7时测试失败-“CommandAcceptanceException:执行DDL时出错”

0kjbasz6  于 2023-01-02  发布在  Spring
关注(0)|答案(3)|浏览(166)

升级到 Boot 2.7后,使用嵌入式H2数据库的集成测试开始失败。
我在日志中看到此警告消息,但不清楚原因或解决方案:

WARN 8053 ---[           main] o.h.t.s.i.ExceptionHandlerLoggedImpl     :GenerationTarget encountered exception accepting command : Error executing DDL "create table user (id bigint generated by default as identity, email varchar(255) not null, name varchar(255), primary key (id))" via JDBC Statement

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table user (id bigint generated by default as identity, email varchar(255) not null, name varchar(255), primary key (id))" via JDBC Statement
...
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "create table [*]user (id bigint generated by default as identity, email varchar(255) not null, name varchar(255), primary key (id))"; expected "identifier"; SQL statement:
create table user (id bigint generated by default as identity, email varchar(255) not null, name varchar(255), primary key (id)) [42001-212]
...

升级后似乎没有创建User表,因此导致测试失败。

oyxsuwqo

oyxsuwqo1#

Boot 2.7似乎已将其H2依赖项升级到2.x,这不向后兼容,并引入了几项更改:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.7-Release-Notes#h2-21
问题是User现在是一个关键字/保留字(H2 "migration-to-v2" guide在我的例子中没有多大帮助;它提到添加了新的关键字,但没有提供链接):
https://www.h2database.com/html/advanced.html#keywords
因此,我必须做的是使用“引号名称”来定义我的实体的表名(似乎我也可以在表注解中使用反引号,而不是转义双引号):

@Table(name="\"user\"")
@Entity
public class User {
...

我还必须在data.sql文件中使用双引号来表示这个表:

INSERT INTO "user"(id, email, name) VALUES(1, 'test@user.com', 'Test User');

注意:迁移指南还提到了使用SET NON_KEYWORDS命令作为解决方法的可能性,但它也不鼓励这样做。

v440hwme

v440hwme2#

将以下内容添加到您的src/test/resources/application-test.properties文件(假设您的测试使用test概要文件运行):

spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true

如果您的任何JPA实体具有UUID字段,请确保这些字段使用@Column进行注解,并且注解的columnDefinition将列定义为UDID类型。(最简单的形式是:@Column(columnDefinition="UDID")。)这适用于Hibernate bug

gfttwv5a

gfttwv5a3#

这可能是因为schema.sql中存在标识列。通常应使用GENERATED BY DEFAULT AS IDENTITY声明标识列。例如:作业_执行_ID位数标识--应更改为默认情况下生成的作业_执行_ID位数标识。
有关H2版本升级导致的更多此类变更,请参阅http://www.h2database.com/html/migration-to-v2.html

相关问题