H2数据库从1.4.200升级到2.0.204后的集成测试问题 [英] Problems with integration tests after upgrading H2 database from 1.4.200 to 2.0.204

查看:24
本文介绍了H2数据库从1.4.200升级到2.0.204后的集成测试问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

最近,我将SpringBoot 2.5.8项目中的H2数据库从版本1.4.200升级到2.0.204。它仅用于测试目的。对于生产,我们使用PostgreSQL 12.9。 似乎升级后有些词会成为H2数据库中的关键词,例如:dayvalue。调用集成测试后,Hibernate部件DDL失败。

针对这种情况的最佳解决方案是什么?

  1. 查看所有实体并在保留的列名两边加反勾:
    @NotNull
    @Column(name = "day", nullable = false)
    private LocalDate day;
    @NotNull
    @Column(name = "`day`", nullable = false)
    private LocalDate day;
  1. 仅为集成测试目的提供专用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
我认为第一个解决方案应该同时适用于PostgreSQLH2数据库。虽然day标识符在PostgreSQL 12.9中是非保留的,但它可能会在未来的版本中使用。 第二个应该解决H2数据库的问题。

你对此有何看法?也许对于这种情况有更好的解决方案?或者从SQL:​2016标准中获取保留关键字列表,并通过自定义SpringPhysicalNamingStrategy将它们应用于两个数据库?

推荐答案

在h22.0中,您可以通过将;NON_KEYWORDS=DAY,VALUE附加到JDBC URL来使用SET NON_KEYWORDS设置,但正常的解决方案是无条件地使用spring.jpa.properties.hibernate.globally_quoted_identifiers=true引用生成的SQL中的所有标识符。

当您尝试使用h2的JDBC URL而不是PostgreSQL时,通常也应该有;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DEFAULT_NULL_ORDERING=HIGH。但使用不同的DBMS进行生产和测试并不是一个好主意,而且Hibernate ORM还不完全支持H2 2.0。

这篇关于H2数据库从1.4.200升级到2.0.204后的集成测试问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆