Проблема отображения класса Grails Domain в унаследованную базу данных с полем TEXT - PullRequest
4 голосов
/ 05 июля 2011

Я пытаюсь создать набор классов домена для устаревшей базы данных, используя Grails 1.3.7 и MySQL 5.1.56.Я указываю коннектор MySQL в файле BuildConfig.groovy как «mysql: mysql-connector-java: 5.1.13».

В схеме базы данных есть поле с именем «abstract» типа 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 , и мне интересно, есть ли обходной путьдля этого или каким-либо другим способом моделирования схем, имеющих поля TEXT.

Спасибо,

Gene

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'
}

РЕДАКТИРОВАНИЕ (2): Вот класс Custom Dialect, предложенный ответом @ 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" );
    }
}

1 Ответ

2 голосов
/ 05 июля 2011

Вы, вероятно, могли бы получить собственный диалект из https://github.com/hibernate/hibernate-core/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/MySQLDialect.java и изменить отображение на «текст».Затем примените новый диалект к Datasource.groovy, используя параметр «dialect =».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...