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