Java Hibernate与货币精度

Java Hibernate与货币精度,java,hibernate,types,Java,Hibernate,Types,我有一个hibernate映射,如下所示: 在该表上执行insert时,出现以下错误: Hibernate: insert into INVOICE (INVOICE_DATE, CUSTOMER_ID, SCHOOL_ID, BOOK_FEE, ADMIN_FEE, TOTAL_FEE, ID) values (?, ?, ?, ?, ?, ?, ?) 50156 [AWT-EventQueue-0] WARN org.hibernate.util.JDBCExceptionReporte

我有一个hibernate映射,如下所示:

在该表上执行insert时,出现以下错误:

Hibernate: insert into INVOICE (INVOICE_DATE, CUSTOMER_ID, SCHOOL_ID, BOOK_FEE, ADMIN_FEE, TOTAL_FEE, ID) values (?, ?, ?, ?, ?, ?, ?)
50156 [AWT-EventQueue-0] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 22001
50156 [AWT-EventQueue-0] ERROR org.hibernate.util.JDBCExceptionReporter - Data truncation: Data truncated for column 'ADMIN_FEE' at row 1
50156 [AWT-EventQueue-0] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
我尝试将adminFee的类型更改为双倍,但也没有成功。问题是,Hibernate确实正确地执行了insert,并且将来的select语句会返回当前的一组值,但是这个错误阻止我对此发票进行进一步处理

bookFee、adminFee和totalFee字段都应该是货币。它们在MySQL数据库中定义为十进制(5,2)


如果您能帮助解决此问题,我们将不胜感激。

您是否尝试过分配类型

<property name="adminFee" column="ADMIN_FEE" type="float"/>

问题似乎在于数据的精确性。有时当你有1.2666666。。。该值被截断

您也可以在尝试插入之前尝试将其四舍五入

见:

另外,看看这是否有帮助:

使用float或double来赚钱绝对是不可接受的,甚至可能是非法的(例如,违反法律或至少是法规)。这需要修正,然后错误就会消失。浮点精度有限,根本无法准确表示大多数小数


我将使用整数类型(int,long)。只要你能避免溢出,就永远不会有任何有趣的问题。

我最终没有使用float、BigDecimal或double。我回到客户那里,他们同意把硬币扔了,因为不管怎样,客户总是被收取四舍五入的费用,所以没有必要储存硬币。但是,我仍然需要弄清楚如何正确地存储货币,因为这可能会再次出现。

自定义Hibernate映射和类定义将是一个很好的方法。

首先配置Hibernate以显示实际的SQL查询。这将非常有帮助。您是将它们定义为十进制5,2还是此Hibernate正在执行?我定义了,但我继承了大部分数据,因此没有太多选项。这是Hibernate设置为显示查询的“实际SQL查询”。就我所能找到的而言,没有办法显示它实际使用的价值。不幸的是,美国财政部正在增加长期溢出的风险。事实上,它们更可能有长期的下溢。如果你使用最基本的量化单位(例如,日元兑换日元,美分兑换我们),您可以完全避免分数。尝试使用BigDecimal。。。我所有的数学都搞砸了,现在它只在所有字段中保存0。哦,这个特定的应用程序没有法律问题,数字最终会四舍五入到下一个最大的整数,但他们希望完全保存它。客户都知道这一点,但是用什么类型的?Java类型中的数字(5,2)映射到什么?
Hibernate: insert into INVOICE (INVOICE_DATE, CUSTOMER_ID, SCHOOL_ID, BOOK_FEE, ADMIN_FEE, TOTAL_FEE, ID) values (?, ?, ?, ?, ?, ?, ?)
50156 [AWT-EventQueue-0] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 22001
50156 [AWT-EventQueue-0] ERROR org.hibernate.util.JDBCExceptionReporter - Data truncation: Data truncated for column 'ADMIN_FEE' at row 1
50156 [AWT-EventQueue-0] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
<property name="adminFee" column="ADMIN_FEE" type="float"/>