我正在使用Hibernate作为我们的对象关系映射,使用一个隐藏数据库的自定义方言.
我从这个数据库中检索的实体有一列:
@Column(name = "GROSS_WEIGHT", precision = 9, scale = 3)
private BigDecimal grossWeight;
Run Code Online (Sandbox Code Playgroud)
数据库将此列定义为数字,精度为9,标度为3.
我可以看到Hibernate生成的SQL来检索数据,当我使用数据库查询工具执行相同的Query时,它会返回GROSS_WEIGHT列的"9.68".
但是,在由Hibernate检索的实体中,'grossWeight'字段包含值'10',其中scale0和precision2 为0 !
在我正在使用的自定义方言类中,我尝试重写以下列类型:
registerColumnType( Types.DECIMAL, "numeric($p,$s)" );
registerColumnType( Types.DOUBLE, "numeric($p,$s)" );
registerColumnType( Types.NUMERIC, "numeric($p,$s)" );
Run Code Online (Sandbox Code Playgroud)
但它仍然只返回(舍入的)整数.
这在我们使用Postgres方言从Postgres检索对象的应用程序的其他地方有效.
知道我应该在方言中做什么,所以我可以让Hibernate正确设置检索到的BigDecimal的精度/比例?
我正在使用Play框架与Ebean和H2数据库.
问题是,BigDecimalDB脚本中的结果如下:
sum decimal(38),
Run Code Online (Sandbox Code Playgroud)
但我想要的是:
sum decimal(38,2),
Run Code Online (Sandbox Code Playgroud)
我已经尝试在模型中定义这样的值:
@Digits(integer=6, fraction=2)
private BigDecimal sum;
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
在 Java 中,new BigDecimal("1.0") != new BigDecimal("1.00")即规模很重要。
然而,这显然不适用于 Hibernate/SQL Server。如果我将 BigDecimal 上的比例设置为特定值,通过 Hibernate 将 BigDecimal 保存到数据库,然后重新膨胀我的对象,我会返回一个具有不同比例的 BigDecimal。
例如,值 1.00 返回为 1.000000,我假设是因为我们将 BigDecimals 映射到定义为的列 NUMERIC(19,6)。我不能只将列定义为所需的比例,因为我需要将美元和日元值(例如)存储在同一列中。我们需要在数据库中将 BigDecimal 表示为数字类型,以便外部报告工具使用。
是否存在“正确”映射 BigDecimal 的 Hibernate UserType,还是我必须自己编写?