#java #hibernate
#java #гибернация
Вопрос:
Примечание: Ответ в конце вопроса
Я создал несколько столбцов в своей базе данных My SQL и, очевидно, раньше не создавал с плавающей запятой, потому что мне нужно было его искать. Для соответствия SQL я создал свои столбцы таким образом:
ИЗМЕНИТЬ датчик ТАБЛИЦЫ, ДОБАВИТЬ поле 1_calibration_offset DECIMAL(4, 3);
Умножьте 8 на каждый столбец.
Я определил их в своем Java-коде следующим образом:
@Column(name = «FIELD1_CALIBRATION_OFFSET») частное поле с плавающей запятой 1calibrationoffset;
что привело к ошибке:
Неправильный тип столбца в PsDb.dbo.Sensor для столбца FIELD1_CALIBRATION_OFFSET. Найдено: десятичный, ожидаемый: с плавающей точкой
Окончательный ответ
Следуя приведенному ниже ответу @jbrookover, я изменил на BigDecimal, я получил:
Wrong column type in PsDb.dbo.Sensor for column FIELD1_CALIBRATION_OFFSET. Found: decimal, expected: numeric(19,2)
Итак, я просмотрел свои сопоставления в режиме гибернации и сделал:
@Column(name = "FIELD1_CALIBRATION_SCALE", columnDefinition="decimal", precision=4, scale=3)
private BigDecimal field1CalibrationScale;
Ответ №1:
Я склонен позволять Hibernate создавать свои таблицы, поэтому я не уверен в этом на 100%, но нет никаких оснований предполагать, что Java Float сопоставляется с ДЕСЯТИЧНЫМ MySQL. На самом деле, согласно документации, DECIMAL — это точный тип, а FLOAT и REAL — приближения. Я считаю, что Java Float является приближением, поэтому это несоответствие кажется логичным.
Если вы хотите использовать ДЕСЯТИЧНЫЙ MySQL, попробуйте Java java.math.BigDecimal
вместо java.lang.Float
.
Комментарии:
1. Вы правы в том, что Java float является приближением. Я должен был подумать об использовании BigDecimal сам. Позвольте мне поработать над этим. Что бы я использовал в своей базе данных для сопоставления с float? Кроме того, это MS SQL Server, а не MySQL.
2. После перехода на BigDecimal я получил: Неправильный тип столбца в PsDb.dbo.Sensor для столбца FIELD1_CALIBRATION_OFFSET. Найдено: десятичный, ожидаемый: числовой (19,2) Поэтому я просмотрел свои сопоставления в режиме гибернации и сделал: @Column(name = «FIELD1_CALIBRATION_SCALE», ColumnDefinition =»десятичный», точность = 4, масштаб = 3) частное десятичное поле 1calibrationscale;
Ответ №2:
Я сам столкнулся с этой проблемой, используя Jboss 7 и MSSQL.
Я считаю, что ответ @Thom правильный и заслуживает большего внимания.
обратите внимание, что параметр name является необязательным, если ваше значение имеет то же имя, что и столбец базы данных.
@Column(name="myColumnName" columnDefinition="decimal", precision=18, scale=3)
private BigDecimal myColumnName;
Комментарии:
1. На самом деле это комментарий к другому ответу. Я не думаю, что это должно быть опубликовано как вопрос.
2. @joelgoldstick Я не хотел публиковать это как вопрос, а скорее как ответ. Том упомянул это решение в комментарии к приведенному выше ответу. Я лично видел этот пост 2 раза, прежде чем понял, что ответ на его первоначальный вопрос был скрыт в комментарии к ответу выше.
3. моя ошибка. Я хочу ответить.
4. @andreico Спасибо за отзыв. Я включил свой ответ в вопрос, чтобы его было легче найти. Пожалуйста, проголосуйте, чтобы повысить видимость.
5. Это сработало для моего десятичного числа (22,4), выполнив точность = 22, масштаб = 4 для BigDecimal. Спасибо, чувак.