JPA映射Oracle表NUMBER字段的@Column配置及Java类型选择
Oracle NUMBER字段映射Java实体类方案
字段A(NUMBER(6,3))映射说明
- 类型选型:绝对不推荐使用Float。Float是单精度浮点数,二进制存储机制天然存在精度丢失问题,哪怕你只存3位小数,也可能出现类似
1.003存成1.00299999的偏差,只要是需要精确数值的场景(比如计量、计价、坐标)都不能用。
如果你实在觉得BigDecimal写起来麻烦,这个精度下用Double也比Float靠谱,但最优选择依然是BigDecimal:Oracle JDBC驱动对NUMBER转BigDecimal是原生无损耗映射,后续做数值加减乘除也不会踩浮点数计算的坑,长期来看省很多排查精度问题的时间。 @Column注解配置:你提到的precision = 6, scale = 2配置是错误的,原字段标度是3,要和库表一致。当前阶段不做DDL生成的话,不配这两个参数不会影响正常读写,但如果你后续要靠实体生成H2测试库表,必须写成@Column(precision = 6, scale = 3),提前配好也能避免后续迭代时出现测试环境、生产环境表结构精度不一致的问题。
字段B(NUMBER(6,0))映射说明
- 类型选型:用
Integer或者基础类型int完全足够。NUMBER(6,0)的可存储范围是-999999 ~ 999999,而Java Integer的取值范围是-2147483648 ~ 2147483647,完全覆盖该字段的取值区间。
注意一个细节:如果Oracle中该字段允许为NULL,必须用包装类Integer,否则查询到NULL值时会触发空指针异常;如果字段加了NOT NULL非空约束,用基础类型int没有任何问题。
补充提示
后续用H2做单元测试时,建议在JDBC连接串中加上MODE=Oracle参数开启Oracle兼容模式,避免自动生成表结构时NUMBER类型的映射逻辑和Oracle不一致。
内容的提问来源于stack exchange,提问作者Thomas Campos
相关产品推荐
相关产品推荐

