Каковы лучшие обходные решения для известных проблем с проверкой схемы Hibernate столбцов с плавающей точкой при использовании Oracle 10 г?

У меня есть несколько классов 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-сервером?

18
задан Pascal Thivent 9 May 2010 в 13:53
поделиться

2 ответа

Это известное ограничение валидатор схемы, проверьте 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 и двойной точности различаются на уровне драйвера.

21
ответ дан 30 November 2019 в 08:10
поделиться

Была похожая проблема HHH-1598 с HSQL отображениями булевых полей, и ее обсуждение здесь.

Решение, которое я решил использовать, было найдено в обсуждении, упомянутом выше, с расширением HSQLDialect.

Я не увидел никаких проблем с этим, хотя я использую HSQL только в тестах.

Это точно не мешает работе с другими БД.

1
ответ дан 30 November 2019 в 08:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: