2011-07-05 39 views
4

我正在嘗試使用Grails 1.3.7和MySQL 5.1.56爲遺留數據庫構建一組域類。我將BuildConfig.groovy文件中的MySQL連接器指定爲'mysql:mysql-connector-java:5.1.13'。使用TEXT字段將Grails域類映射到遺留數據庫問題

數據庫模式有一個名爲TEXT類型爲「抽象」的字段。

我聲明我班上相應的屬性如下(爲清楚起見只顯示相關部分):

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 bug的討論,我想知道是否有是它的一個變通,或建模的一些其他的方式具有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' 
} 

編輯(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等,並更改'文字'的映射。然後使用「dialect =」設置將新方言應用於Datasource.groovy。

+0

我想通過設置DataSource.groovy dataSource閉包中的方言屬性來改變方言,但它似乎沒有被實例化。 (我把一個打印語句放到構造函數中,在堆棧跟蹤之前沒有看到相應的輸出。)我也嘗試將方言設置爲MySQL5Dialect,最後我設置了hibernate日誌級別來跟蹤,這產生了一堆「Binding財產「聲明,但沒有任何指示錯誤。我還應該嘗試確保方言設置得到尊重? –

+0

你可以plz發佈datasources.groovy片段嗎? –

+0

我將它添加到我的問題中。謝謝你的幫助! –

相關問題