hibernate保存bigdecimal

时间:2016-02-03 08:20:55

标签: java hibernate bigdecimal

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

但是当我尝试直接使用SQL查询插入值然后使用hibernate load方法获取时,我看到getAmount方法的SOP正确打印了值。

代码:

>>> import pandas as pd
>>> df_dmg = pd.DataFrame.from_dict(dict_dmg)
>>> df
          Electric  Fighting  Grass  Ground  Normal  Rock  Water
Bug            NaN       0.5    0.5     0.5     NaN   2.0    NaN
Dark           NaN       2.0    NaN     NaN     NaN   NaN    NaN
Dragon         0.5       NaN    0.5     NaN     0.5   NaN    0.5
Electric       0.5       NaN    NaN     2.0     NaN   NaN    NaN
Fairy          NaN       0.5    NaN     NaN     NaN   NaN    NaN
Fighting       NaN       NaN    NaN     NaN     NaN   0.5    NaN
Fire           NaN       NaN    0.5     2.0     NaN   2.0    2.0
Fly            2.0       0.5    0.5     NaN     NaN   2.0    NaN
Grass          0.5       NaN    0.5     0.5     NaN   NaN    0.5
Ground         NaN       NaN    2.0     NaN     NaN   0.5    2.0
Ice            NaN       2.0    NaN     NaN     NaN   2.0    NaN
Normal         NaN       2.0    NaN     NaN     NaN   NaN    NaN
Poison         NaN       0.5    0.5     2.0     NaN   NaN    NaN
Psychic        NaN       0.5    NaN     NaN     NaN   NaN    NaN
Rock           NaN       2.0    2.0     2.0     0.5   NaN    2.0
Steel          NaN       2.0    0.5     2.0     NaN   0.5    NaN
Water          2.0       NaN    2.0     NaN     NaN   NaN    0.5

def dmg_modifier3(attack_type, receiver_pokemon_type, df_dmg):
    dmg = df_dmg[attack_type][receiver_pokemon_type]

    print "{0} deals {1}x damage".format(attack_type, dmg)

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());

输出: 0.00000000008978076

2 个答案:

答案 0 :(得分:0)

将表联系人的数量列更改为NUMBER(19,2)的数据类型。像

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

答案 1 :(得分:0)

当hibernate将对象保存到数据库中时,它会调用toString方法来获取值并保存它。当我深入地检查BigDecimal对象时,我发现toString方法返回指数值,因此值以不同的值进入DB。为此我编写了一个自定义类,扩展了BigDecimal并覆盖了toString方法,该方法在内部将调用BigDecimal的toPlanString方法并有助于克服,插入的指数值将是一个不同的值。