带有破折号的MySQL模式名称会导致Hibernate hbm2ddl.auto出错

时间:2017-07-05 11:25:31

标签: mysql hibernate

我在开发环境中使用hibernate.hbm2ddl.auto=update,最近我将hibernate版本从5.1.0.Final升级到5.2.X.Final,我开始遇到hibernate自动生成的命令错误我的架构名为portal-appname

在hibernate 5.1.0中,当我为给定表添加一个新列时,执行以下命令:

Hibernate: alter table answer add column fake integer not null

但是在Hibernate 5.2.X中,架构被添加为给定表名的前缀:

Hibernate: alter table portal-appname.answer add column fake integer not null

这显然不是一个有效的sql命令:

MySQL server version for the right syntax to use near '-appname.answer add column fake integer not null' at line 1

Hibernate应将portal-appname.table与backtips自动封装为:

Hibernate: alter table `portal-appname`.`answer` add column fake integer not null

我尝试使用hibernate.globally_quoted_identifiers,但它只引用列名但不引用portal-appname.table对。

有趣的是,hibernate 5.2.X只使用带有列名的语法,但它并没有在其他类型的更改中为模式添加前缀,例如:

Hibernate: alter table tablename add constraint FKftsiakun1f5qp01aabdw887kp foreign key (logo) references tablename2 (id)

最后但同样重要的是,我正处于能够将我的架构重命名为其他东西的那一刻。此外,我可以降级到hibernate 5.1.0,但我想知道为什么hibernate引入了这种行为,如果有什么可以避免它。

非常欢迎任何帮助。

1 个答案:

答案 0 :(得分:0)

要保持Hibernate 5.2+,你必须禁用方言中的shema限定符:

void add2(Integer i, Double d1) {
  Double d2= Double.valueOf((double) i.intValue() + d1.doubleValue());
}

示例方言there。 还要确保使用只能查看目标数据库的特定用户:不要使用“root”。 Hibernate从所有数据库中提取所有可见表,即使它与您指定的表不同。