Hibernate: Найдено: float, ожидается: двойная точность - PullRequest
9 голосов
/ 26 марта 2010

У меня проблема с отображением типа данных Oracle Float двойной точности на тип данных Java Double. Средство проверки схемы гибернации, похоже, не работает, если используется тип данных Java Double.

org.hibernate.HibernateException: Wrong column type in DB.TABLE for column amount. Found: float, expected: double precision

Единственный способ избежать этого - отключить проверку схемы и надеяться, что схема синхронизируется с готовым к запуску приложением. Это должно быть исправлено, прежде чем оно поступит в производство.

Окружение приложения:
- Грааль 1.2.1
- Hibernate-core 3.3.1.GA
- Oracle 10g

Ответы [ 7 ]

10 голосов
/ 07 ноября 2012

Если вы не определили тип столбца как double precision в файле DDL, Oracle преобразует его в float тип столбца. Поэтому вам нужно зарегистрировать double как тип столбца с плавающей точкой в ​​классе диалекта.

public class Oracle10gDialectExtended extends Oracle10gDialect {

    public Oracle10gDialectExtended() {
        super();
        registerColumnType(Types.DOUBLE, "float");
    }
}

Наконец зарегистрируйте Oracle10gDialectExtended в конфигурации Hibernate / JPA как hibernate.dialect.

4 голосов
/ 26 марта 2010

Нужна дополнительная информация. Стол двухместный? Я не знаком с Oracle, но это тип с плавающей запятой? К какому типу java.sql.Types это относится? Вы можете увидеть отображение java.sql.Types в базу данных в классе диалектов для вашей базы данных. В этом случае это org.hibernate.dialect.Oracle10gDialect (что расширяет 9i и 8i). Похоже, у вас есть

registerColumnType( Types.DOUBLE, "double precision" );

Таким образом, таблица должна быть определена как double precision, а класс java должен быть определен как нечто, что будет отображаться в Types.Double, обычно double.

Из сообщения об ошибке похоже, что ваша таблица определена как float, которая будет использовать это отображение

registerColumnType( Types.FLOAT, "float" );

, для которого ожидаемый тип Java будет чем-то, что отображается на Types.FLOAT, обычно float; одно значение точности.

Самое простое, что нужно сделать - это изменить таблицу или класс Java, чтобы он соответствовал. Кроме того, вы можете указать тип пользователя, который будет отображать значение с одинарной точностью в значение с двойной точностью; Я не могу вспомнить, почему вы действительно захотите это сделать, но, может быть, если бы у вас не было контроля над классом и столом, что довольно редко, я бы подумал.

НТН.

3 голосов
/ 14 июля 2015

Если вы используете метод аннотации, вам необходимо объявить тип столбца, как показано ниже для поля.

@Column(name = "PERFORMANCE", columnDefinition = "FLOAT(5,2)")
private double performance;
1 голос
/ 18 августа 2010

У нас была такая же проблема. Мы решили эту проблему, убедившись в том, что для простоты установите тип столбца в отображении, например:

<property name="performance" type="double">
  <column name="PERFORMANCE" sql-type="float" />
</property>
0 голосов
/ 05 июня 2019

application.properties

hibernate.dialect=com.test.config.Oracle10gDialectExtended

создать класс

package com.test.config;

import java.sql.Types;

import org.hibernate.dialect.Oracle10gDialect;

public class Oracle10gDialectExtended extends Oracle10gDialect {

    public Oracle10gDialectExtended() {
        registerColumnType(Types.DOUBLE, "float");
    }
}
0 голосов
/ 19 августа 2013

У меня была эта проблема при переносе приложения jboss 4 / hibernate 3 на as7 / hibernate4. Проблема решена предложением Роба Кейлти об изменении hbm2ddl.auto с проверки на обновление без изменения устаревшего кода.

0 голосов
/ 26 июня 2012

У меня был случай, когда мой тип столбца Oracle был NUMBER, а тип Java был double.

Наконец-то проследил, что было до настроек

<property name="hbm2ddl.auto">validate</property>

только что изменил его на

<property name="hbm2ddl.auto">update</property>

и все заработало!

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