更新到Hibernate 6后,创建表别名的行为似乎发生了变化。结果是一个Oracle错误“ORA-00911:无效字符”,因为某些标识符以下划线开头。
一点上下文:使用Kotlin,我们希望以安全的方式访问实体的某些字段,但Hibernate需要完全访问。因此,我们为客户端指定了一个 public 字段volumesPerHour
,为Hibernate指定了一个 private 字段_volumesPerHour
。但是,这些名称用于创建某些标识符;一个实体Shift
的例子:
/* select s._volumesPerHour from Shift s where s.id = "1234-5678" */
select _1_0.id,… from shift s1_0 join volumes_per_hour _1_0 on s1_0.id=_1_0.shift_id where s1_0.id='1234-5678'
为了引用表shift
和volumes_per_hour
,Hibernate创建了表别名s1_0
和_1_0
。一个似乎是从表名派生的,另一个则是从 * 字段名 * 派生的。由于前导下划线在Oracle中是非法的,这会中断查询。
Hibernate 5中的命名模式不同,产生了shift0_
和volumespe0_
。现在,使用org.hibernate.dialect.OracleDialect
而不是org.hibernate.dialect.Oracle12cDialect
(因为后者已被弃用)Hibernate会破坏Oracle。我能做些什么来防止它?
1条答案
按热度按时间ctzwtxfj1#
如果您的标识符以下划线开头,那么在Oracle中,您必须使用双引号标识符。
在Hibernate中,有一个选项
hibernate.globally_quoted_identifiers
,你可以设置为true
,它将所有标识符都用双引号括起来。