Grails 1.3.7とMySQL 5.1.56を使用してレガシーデータベース用の一連のドメインクラスを構築しようとしています。 BuildConfig.groovyファイルのMySQLコネクタを 'mysql:mysql-connector-java:5.1.13'と指定しています。問題TEXTフィールドを持つGrailsドメインクラスをレガシーデータベースにマッピングする
データベーススキーマには、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」にタイプを設定した場合、私は、一見関連のHibernate bugの議論を見て、それのための回避策 - 、またはモデリングの他のいくつかの方法がある場合、私は疑問に思って
Could not determine type for: longtext, at table: papers,
for columns: [org.hibernate.mapping.Column(abstract)]
を取得しますTEXTフィールドを持つスキーマ。
おかげで、
遺伝子
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'
}
EDITED(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");
}
}
DataSource.groovyのdataSourceクロージャでdialectプロパティを設定して方言を変更しようとしていますが、インスタンス化されていないようです。 (私はprintステートメントをコンストラクタに入れ、スタックトレースの前に対応する出力が表示されないようにします)また、MySQL5Dialectに方言を設定しようとしましたが、最後に、トレースするためにハイバネートログレベルを設定しました。プロパティ "ステートメントが、エラーを示すものは何もありません。私は、方言の設定が尊重されていることを確認するために何をすべきですか? –
あなたはdatasources.groovyスニペットを投稿できますか? –
私はそれを私の質問に加えました。ご協力いただきありがとうございます! –