Hibernate - точность точного картирования BigDecimal - PullRequest
4 голосов
/ 13 октября 2011

Проблема: Похоже, мой класс отображения для большого десятичного числа сбрасывает 0 при получении значений, например, 50,20, из базы данных Oracle.Он будет правильно получать значение, если его 50,23, но ничего с 0 на конце.Я представляю что-то простое, что мне не хватает.Предложения?Заранее спасибо.

Подробности

База данных: Oracle 11G Определение поля: Числовое (8,2)

преобразователь / установщик сопоставления

    @Column ( name="PRICE", precision = 8, scale = 2 )
private BigDecimal price;

public BigDecimal getPrice()
{
    return price;
}
public void setPrice( BigDecimal price )
{
    this.price = price;
}

Ответы [ 3 ]

5 голосов
/ 13 октября 2011

50.2 - это то же самое, что и 50.20, 50.200 и т. Д. Если вы хотите отобразить его с двумя цифрами, используйте java.text.DecimalFormat.format(..)

Задание точности ограничивает максимальное количество десятичных цифр, а неминимум.

3 голосов
/ 07 февраля 2014

Я могу вам сказать, что создание значения BigDecimal, возвращаемого из базы данных, осуществляется с помощью проприетарной реализации драйвера JDBC getBigDecimal метода специфичного для базы данных подкласса ResultSet.

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

Похоже, что некоторые реализации метода getBigDecimal будут использовать точность / масштаб, определенные в схеме базы данных, или будут пытаться оптимизировать BigDecimal, возвращаемый только путем определения минимальной точности / масштаба, требуемой для хранения значения извлекаться. Я предполагаю, что драйвер Oracle делает последнее.

См. Также этот другой вопрос .

0 голосов
/ 08 октября 2015

В классе Business Logic вы также можете установить значение следующим образом:

object_name.setPrice (новый BigDecimal (50.20));

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