0

プロジェクトのいくつかのクラスを管理するために hibernate を使用しています。MySQL 5.5 は、基盤となる RDMS です。

したがって、通常の操作では、休止状態の方言として org.hibernate.dialect.MySQL5InnoDBDialect を使用します。

しかし、単体テストではhsql 1.8.0.8を使用しており、テスト用の方言としてorg.hibernate.dialect.HSQLDialectを使用しています。

私のチームの開発者の 1 人が「varchar」列を「mediumtext」に変更するまで、これは問題ではありませんでした。

現在、単体テストに HSQLDialect も MySQL5InnoDBDialect も使用できません。

HSQLDialect から拡張された独自の方言を作成し、型を次のように登録してみました

registerColumnType( Types.VARCHAR, 16777215, "mediumtext" );

コンストラクターで、これは機能していないようです。

私が書いたカスタム方言は次のとおりです

import org.hibernate.dialect.HSQLDialect;

public class HSqlMySqlDialect extends HSQLDialect{
     public HSqlMySqlDialect() {
            super();
            registerColumnType( Types.VARCHAR, "mediumtext" );
     }

}

私のテストhibernate.cfg.xmlは以下のようになります

<property name="dialect">com.alcatel.util.hibernate.HSqlMySqlDialect</property>
<property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="connection.url">jdbc:hsqldb:mem:testDB</property>

Ibernate sessionfactory が開始されたときに発生するエラーは次のとおりです。

ERROR [SchemaExport] Wrong data type: MEDIUMTEXT in statement [create table TABLE_NAME (ID bigint not null, VALUE mediumtext]

そのため、テーブルを作成するときに方言が使用されていないようです。

回避策はありますか?

4

3 に答える 3

0

「方言」プロパティを設定せず、実行時に Hibernate に正しい方言を自動検出させるのが最善の解決策だと思います。

于 2013-03-29T08:55:59.900 に答える
0

HSQLDB 2.x を使用して、MEDIUMTEXT のタイプを定義できます。例えば:

CREATE TYPE MEDIUMTEXT AS VARCHAR(100000)

HSQLDB 2.x には、現在 TEXT および CTEXT タイプ定義をサポートする MySQL 構文互換モードがあります。MEDIUMTEXT は、次のリリースでサポートされる可能性があります。

バージョン 1.8 および 2.x には、単一の Hibernate ダイアレクトがあります。MEDIUMTEXT 型を方言サブクラスで LONGVARCHAR として定義できるはずです。

registerColumnType( Types.LONGVARCHAR, "longvarchar" );

于 2013-03-29T13:11:16.013 に答える