アプリをGrails2.4.0にアップグレードし、hibernate4プラグインを使用しています。 run-appを実行すると、インメモリデータベースを使用してドメインクラスごとに以下のエラー例が生成されます。エラーが深刻ではないという休止状態のフォーラムのいくつかの投稿を読みました。ドロップしようとしているテーブルがまだ存在しないため、エラーをログに記録しているだけです。
2014-Mai-24 13:25:26,788エラー[localhost-startStop-1] org.hibernate.tool.hbm2ddl.SchemaExport-SchemaExport.Java 425-HHH000389:失敗:テーブルuser_roleドロップ制約FK_apcc8lxk2xnug8377fatvbn04が存在する場合は変更
2014-Mai-24 13:25:26,789エラー[localhost-startStop-1] org.hibernate.tool.hbm2ddl.SchemaExport --SchemaExport.Java426-テーブル "USER_ROLE"が見つかりません。 SQLステートメント:テーブルuser_roleドロップ制約FK_apcc8lxk2xnug8377fatvbn04が存在する場合は変更[42102-173]
誰かがロギングノイズを止める方法を知っていますか?
これはバグです。そのままにしておくと問題は発生しないようですが、ここにメッセージを表示したくない場合は、いくつかの解決策があります:(編集:オプション2の方がうまくいくようです(この投稿のコメントを参照してください) ))
1.-DataSource.groovyからのsingleSession構成
https://jira.grails.org/browse/GRAILS-11198
2.- H2方言のオーバーライド:
public class ImprovedH2Dialect extends H2Dialect {
@Override
public String getDropSequenceString(String sequenceName) {
// Adding the "if exists" clause to avoid warnings
return "drop sequence if exists " + sequenceName;
}
@Override
public boolean dropConstraints() {
// We don't need to drop constraints before dropping tables, that just
// leads to error messages about missing tables when we don't have a
// schema in the database
return false;
}
}
上記のソリューション@Luisは、MYSQLでも機能します。代わりに、以下のようにMySQL5InnoDBDialectを拡張してください。
import org.hibernate.dialect.MySQL5InnoDBDialect;
public class ImprovedMySQLDialect extends MySQL5InnoDBDialect {
@Override
public String getDropSequenceString(String sequenceName) {
// Adding the "if exists" clause to avoid warnings
return "drop sequence if exists " + sequenceName;
}
@Override
public boolean dropConstraints() {
// We don't need to drop constraints before dropping tables, that just leads to error
// messages about missing tables when we don't have a schema in the database
return false;
}
}
次に、データソースファイルで次の行を変更します。
dialect = org.hibernate.dialect.MySQL5InnoDBDialect
に
dialect = my.package.name.ImprovedMySQLDialect
dbCreate="update"
を設定するだけで、エラーはすぐに消えます。
問題は、アプリを実行するたびにDBが新しく作成されるため、GORM(hibernate)が作成されたことのないテーブルをH2DBにドロップしようとしていることです。残念ながら、dbCreateはデフォルトでcreate-dropに設定されています。これは、実行時にオンザフライで作成されるデータベースには実際には意味がありません。
development {
dataSource {
dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
}