How do I map a BigDecimal in Hibernate so I get back the same scale I put in?

21,729

Just for informational sake, I can tell you that the creation of the BigDecimal coming back from the database is done by the proprietary JDBC driver's implementation of the 'getBigDecimal' method of the database-specific 'ResultSet' sub-class.

I found this out by stepping thru the Hibernate source code with a debugger, while trying to find the answer to my own question.

Share:
21,729
Robert Atkins
Author by

Robert Atkins

Updated on August 22, 2020

Comments

  • Robert Atkins
    Robert Atkins over 3 years

    In Java, new BigDecimal("1.0") != new BigDecimal("1.00") i.e., scale matters.

    This is apparently not true for Hibernate/SQL Server, however. If I set the scale on a BigDecimal to a particular value, save the BigDecimal to the database via Hibernate and then re-inflate my object, I get back a BigDecimal with a different scale.

    For instance, a value of 1.00 is coming back as 1.000000, I assume because we're mapping BigDecimals to a column defined as NUMERIC(19,6). I can't just define the column as the required scale as I need to store both Dollar and Yen values (for example) in the same column. We need to represent the BigDecimals as numeric types in the database for the benefit of external reporting tools.

    Does there exist a Hibernate UserType which maps BigDecimal "properly", or do I have to write my own?

  • Robert Atkins
    Robert Atkins almost 13 years
    This doesn't really help me--I need the number of decimal places preserved for display purposes.
  • Steve
    Steve almost 13 years
    That's a different problem entirely. You want a consistent way to represent the number as a string. String.format(String, Object...) will help you solve that problem.