Я переношу приложение, написанное для Sybase и Hibernate 3.6.4, чтобы начать использовать Oracle 11g. Насколько я понимаю, людям удалось заставить Hibernate работать с Oracle 11g с использованием Oracle10gDialect. Я использую это, но для одного из столбцов, которые сопоставлены java.lang.Double У меня возникают проблемы.
Когда я создаю таблицу с столбцом BINARY_DOUBLE, спящий режим жалуется на высказывание:
Вызывается: org.hibernate.HibernateException: неправильный тип столбца в TEST_SCHEMA.TEST_TABLE для столбца PERCENTAGE. Найдено: binary_double, ожидается: двойная точность
и когда я определяю столбец как DOUBLE PRCEISION, он жалуется, говоря:
Вызывается: org.hibernate.HibernateException: неправильный тип столбца в TEST_SCHEMA.TEST_TABLE для столбца PERCENTAGE. Найдено: float, ожидается: двойная точность
Глядя на документы, обе эти ошибки имеют смысл, потому что в Oracle нет типа данных Double. Но, глядя на код Dialect, я не уверен, почему я вижу вторую ошибку.
Класс org.hibernate.dialect.Oracle8iDialect имеет этот метод, который имеет "двойную точность", сопоставленный с типами.DOUBLE
protected void registerNumericTypeMappings() {
registerColumnType( Types.BIT, "number(1,0)" );
registerColumnType( Types.BIGINT, "number(19,0)" );
registerColumnType( Types.SMALLINT, "number(5,0)" );
registerColumnType( Types.TINYINT, "number(3,0)" );
registerColumnType( Types.INTEGER, "number(10,0)" );
registerColumnType( Types.FLOAT, "float" );
registerColumnType( Types.DOUBLE, "double precision" );
registerColumnType( Types.NUMERIC, "number($p,$s)" );
registerColumnType( Types.DECIMAL, "number($p,$s)" );
}
Итак, я не уверен, почему DOUBLE PRECISION не работает для меня. Любые указания на то, что я делаю неправильно здесь. Я уверен, что те, кто тестировал Oracle11gDialect, использовали Double в своем коде.
Спасибо, К.
Когда вы определяете столбец с DOUBLE PRECISION
Oracle автоматически преобразует его в FLOAT
который может быть проверен с помощью инструкции SQL DESCRIBE <TABLE>;
, По умолчанию нет отображения типов Types.DOUBLE
для float
.
См. Hibernate: Found: float, expected: double precision для добавления этого сопоставления через расширение класса Oracle10gDialect
.
PRCEISION
- это опечатка здесь?@Column(precision=10, scale=2) BigDecimal percentage;