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