2011-10-13 104 views
2

問題: 似乎我的映射類爲一個大的小數點,當從oracle數據庫中抓取50.20這樣的值時,它將會下降0。如果它的值爲50.23,它將正確地獲取該值,但最終沒有任何值爲0。我想象它簡單的東西,我錯過了。建議?提前致謝。休眠 - BigDecimal測繪精度

詳細

數據庫:Oracle 11G 域定義:數字(8,2)

映射的getter/setter

@Column (name="PRICE", precision = 8, scale = 2) 
private BigDecimal price; 

public BigDecimal getPrice() 
{ 
    return price; 
} 
public void setPrice(BigDecimal price) 
{ 
    this.price = price; 
} 
+0

那麼它抓住了50.2? – Bozho

+0

當我執行hibernate.getList時,它抓住50.2而不是50.20,因爲它在數據庫中。我能想到的唯一的事情就是與地圖的映射有關。我也試過把它變成雙倍,沒有任何區別。 – haju

回答

4

50.2相同50.20,50.200,等。如果要用兩位數字顯示,請使用java.text.DecimalFormat.format(..)

指定精度n限制最大小數位數,而不是最小值。

+0

雅,但爲什麼會休眠修剪它?在數據庫中它的50.20,我的映射類不應該修剪默認情況下的尾部0。 – haju

+0

這只是一個演示問題。沒有人修剪零,它只是不顯示toString。 – Bozho

+0

即使在調試器中,你的意思是toString?價格被映射到BigDecimal。在我的代碼中,當我在得到對象值列表的點上設置斷點時,我看到映射值爲58.2。沒有toString被調用。我只是想通過在@Column上使用精度註釋來維護它的值。 – haju

3

我可以告訴你,從數據庫返回的BigDecimal值的創建是由專有JDBC驅動程序實現的特定於數據庫的ResultSet子類的getBigDecimal方法完成的。

我發現這一點通過使用調試器跨過Hibernate源代碼,同時試圖找到答案my own question

似乎getBigDecimal方法的某些實現將使用數據庫模式中定義的精度/標度,或者將嘗試優化返回的BigDecimal,只定義檢索值所需的最小精度/標度。我猜測Oracle驅動程序正在執行後者。請參閱this other question

-3

業務邏輯類,你可以用這種方式也設置值:

object_name.setPrice(新的BigDecimal(50.20));