4

Grails1.3.7とMySQL5.1.56を使用して、レガシーデータベースのドメインクラスのセットを構築しようとしています。BuildConfig.groovyファイルでMySQLコネクタを「mysql:mysql-connector-java:5.1.13」として指定しています。

データベーススキーマには、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」に設定すると、次のようになります。

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

一見関連していると思われるHibernateのバグについての議論を見ましたが、その回避策、またはTEXTフィールドを持つスキーマをモデル化する他の方法があるかどうか疑問に思っています。

ありがとう、

遺伝子

編集済み:関連する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@Stefanの回答で提案されているように、Customクラスは次のとおりです。

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" );
    }
}
4

1 に答える 1

2

おそらくhttps://github.com/hibernate/hibernate-core/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/MySQLDialect.javaからカスタム方言を派生させ、 '文章'。次に、「dialect =」設定を使用して、新しい方言をDatasource.groovyに適用します。

于 2011-07-05T19:39:55.997 に答える