У меня есть несколько классов Java с двойными полями, через которые я сохраняюсь, в спящем режиме. Например, я имею
@Entity
public class Node ...
private double value;
Когда Hibernate org.hibernate.dialect.Oracle10gDialect
создает DDL для таблицы Node, он отображает поле значения на тип "двойной точности".
create table MDB.Node (... value double precision not null, ...
Казалось бы, что в Oracle, "двойная точность" является псевдонимом для "плавания". Так, когда я пытаюсь проверить схему базы данных с помощью org.hibernate.cfg.AnnotationConfiguration.validateSchema()
метод, Oracle, кажется, описывает столбец значений как "плавание". Это вызывает, в спящем режиме для выдачи следующего Исключения
org.hibernate.HibernateException: Wrong column type in DBO.ACL_RULE for column value. Found: float, expected: double precision
Очень похожая проблема перечислена в базе данных JIRA Hibernate как HHH-1961. Я хотел бы постараться не делать что-либо, что повредит MySql, Пост-ГРЭС и поддержку SQL Server, настолько расширяющуюся Oracle10gDialect
кажется, является самым многообещающим обходных решений, упомянутых в HHH-1961. Но расширение Диалекта является чем-то, что я никогда не делал, прежде и я боюсь, что могут быть некоторые противные глюки. Каково лучшее обходное решение для этой проблемы, которая не повредит нашу совместимость с MySql, Пост-ГРЭС и SQL-сервером?
Это известное ограничение валидатор схемы, проверьте HHH-2315 . Итак, у вас есть три варианта (на самом деле четыре, но я думаю, что отключение проверки не требуется). Либо:
Используйте float
вместо double
на уровне Java - хотя это может быть не вариант.
Патч org.hibernate.mapping.Table.validateColumns (диалект диалекта, отображение сопоставления, TableMetadata tableInfo)
, чтобы добавить особое условие для этого конкретного случая - это не совсем легкий вариант.
Расширяет org.hibernate.dialect.Oracle10gDialect
, чтобы использовать float
для типа SQL DOUBLE
открытый класс MyOracle10gDialect расширяет Oracle10gDialect {{{1} } public MyOracle10gDialect () {
super ();
}
protected void registerNumericTypeMappings () {
super.registerNumericTypeMappings ();
registerColumnType ( Types.DOUBLE, "float");
}
}
Более поздний вариант кажется безопасным, но потребует некоторого тестирования, чтобы увидеть, не вызывает ли он какой-либо регрессии. Я не смотрел код драйвера JDBC Oracle, поэтому не могу сказать, чем float
и двойной точности
различаются на уровне драйвера.
Была похожая проблема HHH-1598 с HSQL отображениями булевых полей, и ее обсуждение здесь.
Решение, которое я решил использовать, было найдено в обсуждении, упомянутом выше, с расширением HSQLDialect.
Я не увидел никаких проблем с этим, хотя я использую HSQL только в тестах.
Это точно не мешает работе с другими БД.