1

H2 は、;MODE=MYSQL を使用し、org.hibernate.dialect.MySQL5Dialect のダイアレクトで hibernate を使用する場合、MySQL5 ダイアレクト用に hibernate によって生成されるインデックス/FK 構文をサポートしていないようです。

ここでの私の目標は、SQL スクリプトのセットを 1 つ用意し、ORM 部分に hibernate を使用することです。MySQL 5.5 ではすべて正常に動作しますが、ユニット テストやアプリのデモ バージョンの起動などに H2 を使用しようとすると、以下に示すように、休止状態で生成された 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 ステートメント: テーブルの変更 SAM_PUBLISHEDSECUREDIP_T インデックス FK1EDEA25B9482C945 (ASSESSMENTID) の追加、制約 FK1EDEA25B9482C945 の追加 外部キー (ASSESSMENTID) 参照 SAM_PUBLISHEDASSESSMENT_T (ID) [42000-172]

注: 私は H2 のパッチを作成して提供することにオープンですが、そのコードベースのどこを調べるかについていくつかのヒントを使用できます。

4

2 に答える 2

4

H2 は、MySQL モードを使用している場合でも、MySQL と 100% 互換性があるわけではありません。一部の SQL ステートメントは H2 でサポートされていないようです。

于 2013-06-11T22:04:01.753 に答える
0

インデックスの作成は使用されalter tableません (MySQL は本当にこの奇妙な構文を使用しますか? 私が知っているすべての DBMSCREATE INDEXはインデックスの作成に使用します)。

これを 2 つのステートメントに分割する必要があります。

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);

私が間違っていなければ、これらの 2 つのステートメントは MySQL でも機能するはずです。

于 2013-06-10T13:22:36.153 に答える