HSQL服务器与内存模式处理SQL保留关键字的差异问题
HSQL服务器模式与内存模式兼容保留关键字表名的问题
背景与生产环境配置
- 小型Spring Boot应用,采用HSQL服务器模式作为数据库,通过Liquibase维护Schema,运行状态正常:
spring.datasource.url=jdbc:hsqldb:hsql://localhost:5678/mydb - 其中一个实体类名称为SQL保留关键字
Group:@Entity public class Group - 该配置下Liquibase可正常创建表,应用也能正常使用此JPA实体。
集成测试环境出现的问题
为编写集成测试避免回归问题,启用了HSQL内存模式:
spring.datasource.url=jdbc:hsqldb:mem:mydb;DB_CLOSE_DELAY=-1
测试初始化时,其他实体均可正常创建,仅Group实体报错:
org.hsqldb.HsqlException: user lacks privilege or object not found: GROUP
执行的SQL语句为:
insert into group (code,lazylock,name,period_id,tenant_id,uid,id) values (?,?,?,?,?,?,default)
但日志显示表已成功创建:
07:07:27.942 [main] INFO liquibase.changelog - Table group created 07:07:27.943 [main] INFO liquibase.changelog - Unique constraint added to group(period_id,code) 07:07:27.943 [main] INFO liquibase.changelog - Unique constraint added to group(uid)
修改实体配置后的冲突
通常给表名加引号可解决保留关键字作为表名的问题,于是修改实体配置:
@Entity @Table(name = "`group`") public class Group
此时集成测试可正常运行,但生产应用本身却抛出异常:
org.hsqldb.HsqlException: user lacks privilege or object not found: group in statement [select g1_0.id,g1_0.code,g1_0.lazylock,g1_0.name,g1_0.period_id,g1_0.tenant_id,g1_0.uid from "group" g1_0 where g1_0.period_id=? order by g1_0.code]
可见HSQL服务器模式与内存模式对保留关键字的处理存在差异。将表名改为group2时两种模式均正常,但我希望保留group作为表名。
重命名表的失败尝试
尝试在已填充数据的数据库中重命名该表,多次尝试均未成功:
alter table group rename to groups;
[Code: -5581, SQL State: 42581] unexpected token: GROUP
alter table "group" rename to groups;
[Code: -5501, SQL State: 42501] user lacks privilege or object not found: PUBLIC.group
alter table 'group' rename to groups;
[Code: -5581, SQL State: 42581] unexpected token: group
注:数据库中确实存在group表。
提问
是否存在URL参数或Hibernate配置可实现两种模式兼容?我已查阅资料但未找到解决方案。
内容的提问来源于stack exchange,提问作者tbeernot
相关产品推荐
相关产品推荐

