2016-02-03 108 views
-1

我有hibernate代碼,它將Bigdecimal數字插入FLOAT類型的Db列。它一般工作。但是,當我嘗試插入值0.00000000009080767 並再次獲取對象時,我看到返回的值不同。休眠保存大紀錄

但是,當我嘗試直接使用SQL查詢插入值,然後使用hibernate load方法獲取值時,我發現getAmount方法的SOP正確輸出值。

代碼:

Contact contact1 = new Contact("sailesh1117777", "[email protected]", "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> 

OUTPUT: 0.00000000008978076

+1

請修改您的問題以添加信息,而不是使用評論。 –

+0

如何將值存儲在數據庫中? –

+1

如果列的類型確實是FLOAT,那麼這並不意外。浮點類型的精度有一個限制,float是精度最低的那個。可能還有其他數據類型,如NUMBER,它允許您指定最大精度,但仍然有一個限制,17個小數位已經相當高IMO。 – Thomas

回答

0

當hibernate將一個對象保存到數據庫中時,它會調用它的toString方法來獲取值並保存它。當我深入檢查BigDecimal對象時,我開始知道toString方法返回指數值,因此值以不同的值進入DB。爲此,我編寫了一個自定義類,擴展了BigDecimal並覆蓋了toString方法,該方法在內部將調用BigDecimal的toPlanString方法並有助於克服,插入的指數值將是一個不同的值。

0

改變你的表的接觸量列數據類型NUMBER(19,2)。像

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