【发布时间】:2021-11-27 06:52:45
【问题描述】:
试图使我的 Spring Boot JPA 应用程序与 Oracle DB 兼容,已经在 MySQL 和 H2 上运行。 不幸的是,liquibase 生成的数据使用了一些 Oracle 的保留关键字作为表名或列名。
好消息是 hibernate 和 liquibase 实现可以检测这些关键字并在查询数据库时“引用”它们(使用 objectQuotingStrategy="QUOTE_ONLY_RESERVED_KEYWORDS" 用于 liquibase,spring.jpa.properties.hibernate.auto_quote_keyword: true 用于休眠)。
坏消息是 hibernate 和 liquibase 不共享相同的 Oracle 保留关键字列表。
例如,value 不被 liquibase 识别为保留关键字,但被 hibernate(使用 ANSI SQL:2003 关键字)识别。 我的一个 liquibase changeSets 创建了一个带有小写 value 列的表,因此 Liquibase 创建了一个带有不带引号的小写 value 列的表,Oracle DB 自动将其转换为大写案例 VALUE 列。现在当休眠尝试获取 该列,它识别 value 并引用它(`SELECT "value" from ...),这使其区分大小写,因此找不到该列 (ORA-00904)。
我想我通过扩展 SpringLiquibase 并添加我的自定义关键字找到了解决方法,如下所述:https://liquibase.jira.com/browse/CORE-3324。问题是这似乎不适用于 OracleDatabase 实现,它覆盖了 SpringLiquibase 的一组保留关键字(当然,isReservedWord() 方法使用 OracleDatabase 的一组)。
现在,我将对 liquibase 和 hibernate.globally_quoted_identifiers 使用 QUOTE_ALL_OBJECTS 引用策略。
但是,出于好奇,我想知道是否可以附加 liquibase 用于 Oracle 的保留关键字集。
- spring boot 版本:2.3.9.RELEASE。
- hibernate-core 版本(spring boot 依赖):5.4.28
- liquibase-core 版本(spring boot 依赖):3.8.9
【问题讨论】:
标签: oracle spring-boot hibernate liquibase