Это происходит из-за серии неудачных событий.
Проблема начинается с того, что HSQLDB не поддерживает тип данных float
. (Duh? Да, я знаю, но Documentation here.)
Проблема начинается становится уродливым из-за того, что HSQLDB делает не просто неудачу при указании float
колонки, но молча повторно интерпретирует его как double
, притворяясь ничего не подозревающим программистом, что все пошло нормально. Так, в своем заявлении create table
вы можете указать тип столбца, как float
и HSQLDB будет успешным, но это только троллинг вас, , потому что если вы позже запросить тип этого столбца, вы найдете , что double
, а не float
.
Затем, позже, зимуют находит эту колонку, чтобы быть double
, в то время как ожидает, что это будет float
, и это не достаточно умны, чтобы использовать тот факт, что float
присваиванию от double
. Всем известно, что double
лучше, чем float
, так спящий режим должен быть на самом деле счастливым что нашли double
в то время как все это было нужно float
, верно? - но нет, у спящего режима не будет , что: когда он ожидает float
, ничего, кроме float
.
Тогда есть эта забавная вещь зимует якобы имеющие встроенной поддержки для 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();