2011-07-05 6 views
4

Grails 1.3.7とMySQL 5.1.56を使用してレガシーデータベース用の一連のドメインクラスを構築しようとしています。 BuildConfig.groovyファイルのMySQLコネクタを 'mysql:mysql-connector-java:5.1.13'と指定しています。問題TEXTフィールドを持つGrailsドメインクラスをレガシーデータベースにマッピングする

データベーススキーマには、TEXTタイプの 'abstract'という名前のフィールドがあります。

次のように私は(唯一の関連部品を明確にするために図示)私のクラスに対応するプロパティを宣言しています:

class Paper { 
    String abstractText 

    static mapping = { 
     table 'papers' 
     abstractText column: 'abstract' 
    } 

    static constraints = { 
     abstractText(nullable: false, maxSize: 65535) 
    } 
} 

私は私の統合テストを実行すると、私は次のエラーを取得する:

Wrong column type in citeseerx.papers for column abstract. 
Found: text, expected: longtext 

宣言を変更した場合

static mapping = { 
     abstractText column: 'abstract', type: 'text' 
    } 

私は同じエラーが発生します。私は「LONGTEXT」にタイプを設定した場合、私は、一見関連のHibernate bugの議論を見て、それのための回避策 - 、またはモデリングの他のいくつかの方法がある場合、私は疑問に思って

Could not determine type for: longtext, at table: papers, 
for columns: [org.hibernate.mapping.Column(abstract)] 

を取得しますTEXTフィールドを持つスキーマ。

おかげで、

遺伝子

EDITED:ここでは、関連するDataSource.groovyがスニペットです:

dataSource { 
    pooled = true 
    driverClassName = "com.mysql.jdbc.Driver" 
    url = "jdbc:mysql://mydbhost:3306/mydb" 
    username = "u" 
    password = "p" 
    dbCreate = 'validate' 
    //dialect = org.hibernate.dialect.MySQL5Dialect 
    dialect = com.fxpal.citeseer.mysql.MyMySQLDialect 
    println("Setting dialog = ${dialect}") 
} 

hibernate { 
    cache.use_second_level_cache = true 
    cache.use_query_cache = true 
    cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider' 
} 

EDITED(2):ここでカスタムDialectクラスは、ステファンさん@により示唆されるように、あります答え:

import java.sql.Types; 

/** 
* An An extension to the SQL dialect for MySQL 5.1 to handle TEXT. 
* 
* @author Gene Golovchinsky 
*/ 
public class MyMySQLDialect extends org.hibernate.dialect.MySQLDialect { 

    public MyMySQLDialect() { 
     super(); 
     System.out.println("MyMySQLDialect: created new instance"); 
    } 

    protected void registerVarcharTypes() { 
     System.out.println("MyMySQLDialect: RegisteringVarcharTypes"); 
     registerColumnType(Types.VARCHAR, 16777215, "mediumtext"); 
     registerColumnType(Types.VARCHAR, 65535, "text"); 
     registerColumnType(Types.VARCHAR, 255, "varchar($l)"); 
     registerColumnType(Types.LONGVARCHAR, "longtext"); 
    } 
} 

答えて

2

カスタムダイヤルhttps://github.com/hibernate/hibernate-core/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/MySQLDialect.javaから変更し、 'text'のマッピングを変更してください。次に、 "dialect ="設定を使って新しい方言をDatasource.groovyに適用します。

+0

DataSource.groovyのdataSourceクロージャでdialectプロパティを設定して方言を変更しようとしていますが、インスタンス化されていないようです。 (私はprintステートメントをコンストラクタに入れ、スタックトレースの前に対応する出力が表示されないようにします)また、MySQL5Dialectに方言を設定しようとしましたが、最後に、トレースするためにハイバネートログレベルを設定しました。プロパティ "ステートメントが、エラーを示すものは何もありません。私は、方言の設定が尊重されていることを確認するために何をすべきですか? –

+0

あなたはdatasources.groovyスニペットを投稿できますか? –

+0

私はそれを私の質問に加えました。ご協力いただきありがとうございます! –

関連する問題