2015-02-12 4 views
2

Я использую встроенный HSQL (HSQLDB) с Hibernate для всех моих модульных тестов, потому что он очень быстрый. У меня есть таблица с колонкой, определяемой следующим образом:HSQL + Hibernate Исключение: Неверный тип столбца: Найдено: double, expected: float

float qw; 

Когда спящий режим начинается, я получаю следующее сообщение об ошибке:

org.hibernate.HibernateException: Wrong column type in MyTable for column qw. 
Found: double, expected: float 

Почему это найти double, когда столбец объявлен как float?

ответ

7

Это происходит из-за серии неудачных событий.

  1. Проблема начинается с того, что HSQLDB не поддерживает тип данных float. (Duh? Да, я знаю, но Documentation here.)

  2. Проблема начинается становится уродливым из-за того, что HSQLDB делает не просто неудачу при указании float колонки, но молча повторно интерпретирует его как double, притворяясь ничего не подозревающим программистом, что все пошло нормально. Так, в своем заявлении create table вы можете указать тип столбца, как float и HSQLDB будет успешным, но это только троллинг вас, , потому что если вы позже запросить тип этого столбца, вы найдете , что double, а не float.

  3. Затем, позже, зимуют находит эту колонку, чтобы быть double, в то время как ожидает, что это будет float, и это не достаточно умны, чтобы использовать тот факт, что floatприсваиванию от double. Всем известно, что double лучше, чем float, так спящий режим должен быть на самом деле счастливым что нашли double в то время как все это было нужно float, верно? - но нет, у спящего режима не будет , что: когда он ожидает float, ничего, кроме float.

  4. Тогда есть эта забавная вещь зимует якобы имеющие встроенной поддержки для HSQLDB, о чем свидетельствует тот факт, что она включает в себя class org.hibernate.dialect.HSQLDialect, но диалекта не заботится о своих плаваниях. Значит, они не считают, что несовместимость типов данных является проблемой диалекта? они никогда не тестировали его с поплавками? Я не знаю, что можно предположить, но истина в том, что диалоги спящего режима для HSQLDB делают , не дают никакой коррекции для этой проблемы.

Итак, что мы можем сделать?

Одним из возможных решений проблемы является создание нашего собственного диалоги спящего режима для HSQLDB, в котором мы исправляем это несоответствие.

В прошлом я сталкивался с подобной проблемой MySQL и boolean VS. bit (см этот вопрос: "Found: bit, expected: boolean" after Hibernate 4 upgrade), поэтому при HSQLDB я решил проблему с float VS. double, объявив свой собственный диалект HSQLDB для спящего режима:

/** 
* 'Fixed' HSQL Dialect. 
* 
* PEARL: HSQL seems to have a problem with floats. We remedy this here. 
* See https://stackoverflow.com/q/28480714/773113 
* 
* PEARL: this class must be public, not package-private, and it must have a 
* public constructor, otherwise hibernate won't be able to instantiate it. 
*/ 
public class FixedHsqlDialect extends HSQLDialect 
{ 
    public FixedHsqlDialect() 
    { 
     registerColumnType(java.sql.Types.FLOAT, "double"); 
    } 
} 

И использовать его следующим образом:

ejb3cfg.setProperty("hibernate.dialect", FixedHsqlDialect.class.getName()); 
    //Instead of: org.hibernate.dialect.HSQLDialect.class.getName(); 
Смежные вопросы