1

当使用 ;MODE=MYSQL 和使用 org.hibernate.dialect.MySQL5Dialect 的方言时,H2 似乎不支持 hibernate 为 MySQL5 方言生成的索引/FK 语法。

我的目标是拥有一组 SQL 脚本并将休眠用于 ORM 部分。在 MySQL 5.5 中一切正常,但是当我尝试将 H2 用于单元测试和启动我的应用程序的演示版本时,我从 hibernate 生成的 alter table 语句中得到数百次失败,如下所示。不幸的是,我还没有找到一种方法让休眠来改变语句的生成方式,但这也可能是一种选择。我尝试使用 org.hibernate.dialect.H2Dialect 但这会产生更严重的错误,所以我认为这不会起作用。

alter table SAM_PUBLISHEDSECUREDIP_T
  add index FK1EDEA25B9482C945 (ASSESSMENTID), 
  add constraint FK1EDEA25B9482C945 foreign key (ASSESSMENTID) 
  references SAM_PUBLISHEDASSESSMENT_T (ID)

在 H2 中导致这样的错误:

org.h2.jdbc.JdbcSQLException:SQL 语句中的语法错误“ALTER TABLE SAM_PUBLISHEDSECUREDIP_T ADD INDEX FK1EDEA25B9482C945 (ASSESSMENTID),[*] ADD CONSTRAINT FK1EDEA25B9482C945 FOREIGN KEY (ASSESSMENTID) REFERENCES SAM_PUBLISHEDASSESSMENT_T (ID)”;SQL 语句:alter table SAM_PUBLISHEDSECUREDIP_T 添加索引 FK1EDEA25B9482C945 (ASSESSMENTID),添加约束 FK1EDEA25B9482C945 外键 (ASSESSMENTID) 引用 SAM_PUBLISHEDASSESSMENT_T (ID) [42000-172]

注意:我愿意为 H2 编写和提供补丁,但我可以使用一些提示来查看该代码库的位置。

4

2 回答 2

4

即使使用 MySQL 模式,H2 也不是 100% 兼容 MySQL。H2 似乎不支持您的某些 SQL 语句。

于 2013-06-11T22:04:01.753 回答
0

创建索引不是使用完成的alter table(MySQL 真的使用这种奇怪的语法吗?我知道的每个 DBMS 都用于CREATE INDEX创建索引)。

您必须将其拆分为两个语句:

CREATE INDEX fk_assessment_id_index 
     on SAM_PUBLISHEDSECUREDIP_T (ASSESSMENTID);

alter table SAM_PUBLISHEDSECUREDIP_T
  add constraint FK1EDEA25B9482C945 foreign key (ASSESSMENTID) 
  references SAM_PUBLISHEDASSESSMENT_T (ID);

如果我没记错的话,这两个语句也应该在 MySQL 中工作。

于 2013-06-10T13:22:36.153 回答