【发布时间】:2022-01-05 11:52:22
【问题描述】:
最近我将SpringBoot 2.5.8项目中的H2数据库从版本1.4.200升级到2.0.204。它仅用于测试目的。对于生产,我们使用PostgreSQL 12.9。
似乎升级后某些词成为H2数据库中的关键字,例如:day,value。调用集成测试后,Hibernate 在DDL 部分失败。
这种情况的最佳解决方案是什么?
- 查看所有实体并在保留的列名称周围应用反引号:
@NotNull
@Column(name = "day", nullable = false)
private LocalDate day;
@NotNull
@Column(name = "`day`", nullable = false)
private LocalDate day;
- 提供专用的
SpringPhysicalNamingStrategy和覆盖toPhysicalColumnName方法仅用于集成测试目的。检查H2数据库中的保留关键字列表并引用它们。
# Datasource related properties
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa
spring.sql.init.mode=always
spring.sql.init.continue-on-error=true
spring.sql.init.platform=h2
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
spring.jpa.hibernate.naming.physical-strategy=[project-related-package-name-here].strategy.CustomH2NamingStrategy
spring.jpa.defer-datasource-initialization=true
我认为第一个解决方案应该适用于 PostgreSQL 和 H2 数据库。尽管day 标识符在PostgreSQL 12.9 中是非保留的,但它可能在未来的版本中。
第二个应该解决H2数据库的问题。
你怎么看?也许这种情况有更好的解决方案?或者也许从SQL:2016 标准中获取保留关键字列表,并通过自定义SpringPhysicalNamingStrategy 将它们应用于两个数据库?
【问题讨论】:
-
选项 3,使用测试容器并使用 PostgreSQL 进行测试。该 H2 版本中有更多重大更改,您升级是否有特定原因?
标签: spring-boot hibernate h2