web-dev-qa-db-ja.com

run-appでのGrails2.4およびhibernate4エラー

アプリを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]

誰かがロギングノイズを止める方法を知っていますか?

20
Ken

これはバグです。そのままにしておくと問題は発生しないようですが、ここにメッセージを表示したくない場合は、いくつかの解決策があります:(編集:オプション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;
    }
}

失敗:Hibernate/JPA/HSQLDBスタンドアロンでテーブルXXXドロップ制約YYYを変更

24
luisZavaleta

上記のソリューション@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
7
Emmanuel John

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"
    }
7
10GritSandpaper