如何在 Hibernate 中映射 BigDecimal 以便获得与输入相同的比例?
在 Java 中,new BigDecimal("1.0") != new BigDecimal("1.00")
即 规模很重要。
然而,对于 Hibernate/SQL Server 来说显然并非如此。如果我将 BigDecimal 的标度设置为特定值,通过 Hibernate 将 BigDecimal 保存到数据库,然后重新膨胀我的对象,我会得到一个具有不同标度的 BigDecimal。
例如,我假设值 1.00 返回为 1.000000,因为我们将 BigDecimals 映射到定义为 NUMERIC(19,6)
的列。我不能仅将列定义为所需的比例,因为我需要将美元和日元值(例如)存储在同一列中。为了便于外部报告工具使用,我们需要在数据库中将 BigDecimals 表示为数字类型。
是否存在“正确”映射 BigDecimal 的 Hibernate UserType,还是我必须编写自己的?
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?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
仅供参考,我可以告诉您,从数据库返回的 BigDecimal 的创建是通过专有 JDBC 驱动程序对数据库特定的“ResultSet”子类的“getBigDecimal”方法的实现来完成的。
我通过使用调试器单步调试 Hibernate 源代码发现了这一点,同时尝试找到我自己的答案 问题。
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.
我认为这会起作用,但我没有测试过。
I think this will work, I didn't test it though.
不确定,但您可以使用
a.compareTo(b) == 0
检查相等性。Not sure, but you can check equality using
a.compareTo(b) == 0
.