bigdecimal 的休眠保存

hibernate save of bigdecimal

我有休眠代码,它将 Bigdecimal 数字插入到 FLOAT 类型的 Db 列中。它一般有效。但是,当我尝试插入一个值 0.00000000009080767 并再次获取对象,我看到返回值不同。

然而,当我尝试直接使用 SQL 查询插入值,然后使用休眠加载方法获取时,我发现 getAmount 方法的 SOP 正确打印了值。

代码:

Contact contact1 = new Contact("sailesh1117777", "unknown@gmail.com", "Vietnam1", "0904277091",new BigDecimal("0.00000000009080767"));
session.persist(contact1);
session.getTransaction().commit();
session.flush();
session.close();

session = sessionFactory.openSession();
Contact contact5 = (Contact) session.load(Contact.class, new Integer(1));
System.out.println(((BigDecimal)contact5.getAmount()).toPlainString());

<class name="Contact" table="CONTACT">
    <id name="id" column="CONTACT_ID">
        <generator class="increment"/>
    </id>
    <property name="name" type="string" column="NAME"/>
    <property name="email"/>
    <property name="address"/>
    <property name="telephone"/>
       <property name="amount" type="big_decimal"/>

</class>

输出: 0.00000000008978076

将 table 联系人的金额列更改为 NUMBER(19,2) 的数据类型。喜欢

ALTER TABLE person
ALTER COLUMN amount NUMBER(19,2)

当hibernate将一个对象保存到数据库中时,它调用它的toString方法来获取值并保存它。当我深入检查 BigDecimal 对象时,我开始知道 toString 方法 returns 指数值,因此该值以不同的值进入数据库。为此,我写了一个自定义 class,扩展 BigDecimal 并覆盖 toString 方法,它在内部将调用 BigDecimal 的 toPlanString 方法并帮助克服,插入的指数值将是一个不同的值。