我有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
答案 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方法并有助于克服,插入的指数值将是一个不同的值。