Hibernate диалект hsql для mysql

Я использую спящий режим для управления некоторыми классами в моем проекте. MySQL 5.5 является базовой RDMS.

Поэтому для обычных операций я использую org.hibernate.dialect.MySQL5InnoDBDialect в качестве диалекта гибернации.

Но для модульного тестирования я использую hsql 1.8.0.8 и использую org.hibernate.dialect.HSQLDialect в качестве диалекта для тестирования.

Это не было проблемой, пока один из разработчиков в моей команде не изменил столбец «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]

Так что похоже диалект не используется при создании таблиц.

Есть ли обходной путь?


person Keshava    schedule 29.03.2013    source источник
comment
Проблема в том, что org.hibernate.cfg.Configuration#buildSessionFactory() не использует диалект, в отличие от других методов класса. См. grepcode.com/file/repo1.maven.org/maven2/org.hibernate/ Похоже, выхода нет.   -  person Keshava    schedule 29.03.2013
comment
Посмотрите: grepcode.com/file/repo1.maven.org/maven2/org.hibernate/ , средний текст комментируется. Следует искать, почему.   -  person Himanshu Bhardwaj    schedule 29.03.2013
comment
Диалект используется: только что извлек журналы из примера запуска спящего режима. INFO: Драйвер JDBC: Драйвер JDBC MySQL-AB, версия: mysql-connector-java-5.1.22 ( Редакция: ${bzr.revision-id} ) 29 марта 2013 г. 2: 16:56 org.hibernate.dialect.Dialect ‹init› INFO: Использование диалекта: org.hibernate.dialect.MySQLDialect   -  person Himanshu Bhardwaj    schedule 29.03.2013
comment
Хорошо, когда вы говорите о запуске приложения, вы имеете в виду, когда создается фабрика сеансов?   -  person Keshava    schedule 29.03.2013
comment
Да, это то, что я имел в виду.   -  person Himanshu Bhardwaj    schedule 29.03.2013


Ответы (3)


Я думаю, что лучшим решением было бы не устанавливать свойство «диалект» и позволить Hibernate автоматически определять правильный диалект во время выполнения.

person Etienne Miret    schedule 29.03.2013
comment
Я пробовал это, это тоже не работает. Hibernate обнаружит, что HSQL является БД, и будет использовать HSQLDialect, и проблема, описанная ниже, возникнет снова. ОШИБКА [SchemaExport] Неверный тип данных: MEDIUMTEXT в операторе [создать таблицу TABLE_NAME (ID bigint не нулевой, VALUE mediumtext] - person Keshava; 29.03.2013

Вы можете использовать HSQLDB 2.x и определить тип для MDIUMTEXT. Например:

СОЗДАТЬ ТИП МЕДИУМТЕКСТ КАК VARCHAR(100000)

HSQLDB 2.x имеет режим совместимости синтаксиса MySQL, который в настоящее время поддерживает определения типов TEXT и CTEXT. MDIUMTEXT может поддерживаться в следующем выпуске.

Для версий 1.8 и 2.x существует единый диалект Hibernate. Вы должны иметь возможность определить тип MEDUMTEXT как LONGVARCHAR в подклассе диалекта.

registerColumnType(Типы.LONGVARCHAR, "longvarchar" );

person fredt    schedule 29.03.2013
comment
Да, версии HSQLDB 2.x поддерживают MDIUMTEXT etx, но моя проблема связана с диалектом гибернации. Есть ли в спящем режиме диалект гибернации, который может понимать МЕДИУМТЕКСТ из файлов *.hbm.xml? Скажем, org.hibernate.dialect.HSQL2xDialect или около того? Я использую спящий режим 3.6. - person Keshava; 29.03.2013

Когда вы регистрируете varchartype следующим образом

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

на самом деле вы говорите, что все varchars с размером ‹=16777215 будут зарегистрированы как средний текст, а не наоборот. Таким образом, идея изменения аннотаций столбцов неверна. Более того, не следует переводить специфические вещи БД в режим гибернации.

Поэтому решение для меня состояло в том, чтобы использовать сам varchar() в аннотациях спящего режима, но преобразовать их в любой тип, который мне нужен, с помощью собственного диалекта.

person Keshava    schedule 03.04.2013