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

У меня есть несколько классов Java с двойными полями, которые я сохраняю через Hibernate. Например, у меня есть

@Entity
public class Node ...

  private double value;

Когда Hibernate org.hibernate.dialect.Oracle10gDialect создает DDL для таблицы узлов, он отображает поле значения в тип "двойной точности".

create table MDB.Node (... value double precision not null, ...

Может показаться, что в Oracle «двойная точность» является псевдонимом «float». Поэтому, когда я пытаюсь проверить схему базы данных с помощью метода org.hibernate.cfg.AnnotationConfiguration.validateSchema(), Oracle, по-видимому, описывает столбец значений как «float». Это заставляет Hibernate выдавать следующее исключение

org.hibernate.HibernateException: Wrong column type in DBO.ACL_RULE for column value. Found: float, expected: double precision

Очень похожая проблема указана в базе данных JIRA Hibernate как HHH-1961 . Я бы хотел избежать всего, что может нарушить поддержку MySql, Postgres и Sql Server, поэтому расширение Oracle10gDialect представляется наиболее перспективным из обходных путей, упомянутых в HHH-1961 . Но расширение диалекта - это то, чего я никогда не делал раньше, и я боюсь, что могут быть некоторые неприятные ошибки. Как лучше обойти эту проблему, чтобы не нарушить нашу совместимость с MySql, Postgres и Sql Server?

Ответы [ 4 ]

20 голосов
/ 13 апреля 2010

Это известное ограничение валидатора схемы, отметьте HHH-2315 . Таким образом, у вас есть три варианта (на самом деле четыре, но я думаю, что деактивация валидации не нужна). Или:

  • Используйте float вместо double на уровне Java - это может быть не вариант.

  • Патч org.hibernate.mapping.Table.validateColumns(Dialect dialect, Mapping mapping, TableMetadata tableInfo), чтобы добавить специальное условие для этого конкретного случая - это не совсем легкий вариант.

  • Расширяет org.hibernate.dialect.Oracle10gDialect, чтобы использовать float для типа SQL DOUBLE

    public class MyOracle10gDialect extends Oracle10gDialect {
        public MyOracle10gDialect() {
            super();
        }
        protected void registerNumericTypeMappings() {
            super.registerNumericTypeMappings();
            registerColumnType( Types.DOUBLE, "float" );
        }
    }
    

Последний вариант кажется безопасным, но потребует некоторого тестирования, чтобы увидеть, не приводит ли он к регрессии. Я не смотрел код драйвера JDBC от Oracle, поэтому не могу сказать, как float и double precision отличаются на уровне драйвера.

5 голосов
/ 26 августа 2011

просто добавление (columnDefinition = "NUMBER (9,2)") работает!

@Column(name = "CREDIT_AMOUNT", columnDefinition = "NUMBER(9,2)")
@Basic
private double creditAmount;
1 голос
/ 08 сентября 2010

Используйте атрибут 'scale' для вашего участника.

1 голос
/ 13 апреля 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...