我正在使用javax.persistence API和Hibernate在Oracle 11g Express数据库中创建注释并保留实体及其属性。
我在实体中有以下属性:
@Column(precision = 12, scale = 9)
private BigDecimal weightedScore;
目标是在小数点右边保留一个最多12位的十进制值和最多9位数。
计算weightedScore
后,结果为0.1234,但是一旦我将实体与Oracle数据库一起提交,该值显示为0.12。
我可以通过使用EntityManager对象查询条目或直接在Web浏览器的Oracle Application Express(Apex)界面中查看它来看到这一点。
我应该如何注释我的BigDecimal属性,以便正确地保持精度?
注意:我们使用内存中的HSQL数据库来运行我们的单元测试,无论是否有@Column
注释,它都不会遇到缺乏精度的问题。
更新
查看表格说明,weightedScore
列的定义为NUMBER(19, 2)
。我现在也尝试将注释更改为@Column(columnDefinition="Number(12, 9)")
,但这没有任何效果。有谁知道为什么Oracle对这些注释没有反应?
答案 0 :(得分:5)
我找到了答案。好哇!
我尝试通过Oracle Apex界面执行以下查询:
alter table NODE modify (WEIGHTEDSCORE NUMBER(12, 9));
我收到一条错误消息,指出包含数据的列无法修改为精度较低或规模较小。这是我的问题!
因为我试图用现有数据改变表格,所以我需要删除表格并重新初始化它,或者将列改为仅具有更高的精度和比例。
我成功尝试了以下查询:
alter table NODE modify (WEIGHTEDSCORE NUMBER(26, 9));
原因是我想在小数点右边添加7个精度位置,所以我在整体精度上加7,以弥补比例的增加。这样,该列可以保留小数点左侧的所有现有精度,同时在右侧添加精度。
答案 1 :(得分:1)
您似乎并不是唯一一个遇到此问题的人:http://www.eclipse.org/forums/index.php/m/716826/