升级到 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
表,因此导致测试失败。
3条答案
按热度按时间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
因此,我必须做的是使用“引号名称”来定义我的实体的表名(似乎我也可以在表注解中使用反引号,而不是转义双引号):
我还必须在
data.sql
文件中使用双引号来表示这个表:注意:迁移指南还提到了使用
SET NON_KEYWORDS
命令作为解决方法的可能性,但它也不鼓励这样做。v440hwme2#
将以下内容添加到您的
src/test/resources/application-test.properties
文件(假设您的测试使用test
概要文件运行):如果您的任何JPA实体具有
UUID
字段,请确保这些字段使用@Column
进行注解,并且注解的columnDefinition
将列定义为UDID
类型。(最简单的形式是:@Column(columnDefinition="UDID")
。)这适用于Hibernate bug。gfttwv5a3#
这可能是因为schema.sql中存在标识列。通常应使用GENERATED BY DEFAULT AS IDENTITY声明标识列。例如:作业_执行_ID位数标识--应更改为默认情况下生成的作业_执行_ID位数标识。
有关H2版本升级导致的更多此类变更,请参阅http://www.h2database.com/html/migration-to-v2.html。