Как мне отобразить BigDecimal в Hibernate, чтобы я вернул тот же масштаб, который я ввел? - PullRequest
4 голосов
/ 01 июля 2011

В Java значение new BigDecimal("1.0") != new BigDecimal("1.00"), т. Е. Масштаб имеет значение .

Однако, по-видимому, это не так для Hibernate / SQL Server.Если я установлю масштаб для BigDecimal на конкретное значение, сохраню BigDecimal в базе данных через Hibernate, а затем заново раздую свой объект, я получу обратно BigDecimal с другим масштабом.

Например, значение1.00 возвращается как 1.000000, я полагаю, потому что мы отображаем BigDecimals в столбец, определенный как NUMERIC(19,6).Я не могу просто определить столбец как необходимый масштаб, так как мне нужно хранить значения доллара и йены (например) в одном столбце.Мы должны представлять BigDecimals как числовые типы в базе данных для использования внешних инструментов отчетности.

Существует ли Hibernate UserType, который отображает BigDecimal "должным образом", или я должен написать свой собственный?

Ответы [ 3 ]

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

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

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

0 голосов
/ 01 июля 2011

Я думаю, что это будет работать, хотя я не проверял это.

public class BigDecimalPOJO implements Serializable {

    private static final long serialVersionUID = 8172432157992700183L;

    private final int SCALE = 20;
    private final RoundingMode ROUNDING_MODE = RoundingMode.CEILING;
    private BigDecimal number;

    public BigDecimalPOJO() {

    }

    public BigDecimal getNumber() {
        return number.setScale(SCALE, ROUNDING_MODE);
    }

    public void setNumber(BigDecimal number) {
        this.number = number.setScale(SCALE, ROUNDING_MODE);
    }
}
0 голосов
/ 01 июля 2011

Не уверен, но вы можете проверить равенство, используя a.compareTo(b) == 0.

...