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提供补丁,但我可以使用一些提示来查看代码库的位置。
答案 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。