H2数据库添加索引和外键约束时不成功的模式语句

时间:2013-06-10 13:00:15

标签: sql hibernate h2

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

我的目标是拥有一组SQL脚本并为ORM部分使用hibernate。在MySQL 5.5中一切正常,但是当我尝试使用H2进行单元测试和启动我的应用程序的演示版本时,我会从hibernate生成的alter table语句中获得数百个失败,如下所示。不幸的是,我还没有找到一种方法来让hibernate改变语句的生成方式,但也可能是一种选择。我尝试使用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   表SAM_PUBLISHEDSECUREDIP_T ADD索引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并为H2提供补丁,但我可以使用一些提示来查看代码库的位置。

2 个答案:

答案 0 :(得分:3)

即使使用MySQL模式,H2与MySQL也不是100%兼容。看来H2不支持你的一些SQL语句。

答案 1 :(得分: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。