簡體   English   中英

問題將 Grails 域 class 映射到帶有 TEXT 字段的舊數據庫

[英]Problem mapping Grails Domain class to legacy database with TEXT field

我正在嘗試使用 Grails 1.3.7 和 MySQL 5.1.56 為遺留數據庫構建一組域類。 我在 BuildConfig.groovy 文件中將 MySQL 連接器指定為“mysql:mysql-connector-java:5.1.13”。

數據庫模式有一個名為“抽象”的 TEXT 類型的字段。

我在我的 class 中聲明相應的屬性如下(為清楚起見僅顯示相關部分):

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 class,正如@Stefan 的回答所建議的那樣:

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

您可能可以從https://github.com/hibernate/hibernate-core/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/MySQLDialect.java派生自定義方言並更改映射'文本'。 然后使用“dialect =”設置將新方言應用於 Datasource.groovy。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM