2

SQLServerまたはOracleバックエンドのいずれかに対して実行されるGrailsアプリケーションがあります。ORMとしてGORMを使用しています。

両方のデータベースタイプをサポートする方法で大きなテキストフィールドをマップしたいと思います。私のGrailsドメインクラスには、次のようなものがあります。

class Note {
    String content

    static constraints = {
        content nullable: false, blank: false
    }
}

次に、次のようなデータベーステーブルを宣言します。

-- oracle
CREATE TABLE NOTE 
(
    id NUMBER(19, 0) NOT NULL,
    version NUMBER(19, 0) NOT NULL,
    content CLOB NOT NULL
);

-- SQL Server
CREATE TABLE NOTE 
(
    id NUMERIC(19, 0) NOT NULL,
    version NUMERIC(19, 0) NOT NULL,
    content NVARCHAR(MAX) NOT NULL
);

GORMはvalidate起動時にモードで実行されており、OracleとSQL Serverのデータ型とGORMマッピングの組み合わせを見つけることができず、GORMが正しく起動しなくてもストレージまたは大きなテキストフィールドを使用できます。

私が試してみました:

  • タイプをtextinmappingsに設定しますが、これは機能しないようです。contentOracleは、フィールドがタイプであると予想することについて不平を言い、SQLServerはこれらの状況でlongタイプを望んでいます。text

  • に設定するtypeclob、スキーマ検証に合格しますが、フィールドを文字列値として設定できなくなります-GORMはタイプのデータを想定していますCLOB

これを機能させるには、データベース定義とGORMをどのように構成する必要がありますか?

4

1 に答える 1

4

ハック的ですが、最終的に解決策が浮かび上がりました。起動時に Grails 構成を照会することで、適切なデータ型を選択できます。

class Note {

    String content

    static constraints = {
        content nullable: false, blank: false
    }

    static mappings = {
        content sqlType: DbSupport.bigStringType
    }
}

class DbSupport {

    static def getBigStringType() {

        // examine which hibernate dialect is selected, and pick
        // an appropriate type mapping for that database type:
        def dialect = ApplicationHolder.application.config.dataSource.dialect
        switch (dialect) {

            case "org.hibernate.dialect.SQLServerDialect":
                return "nvarchar"
                break

            case "org.hibernate.dialect.Oracle10gDialect":
                return "clob"
                break
        }

    }
}
于 2012-11-16T16:38:20.343 に答える