2012-08-10 63 views
3

我們正在使用MyEclipse生成我們的jpa訪問層。之後,我們擁有生成的模型和數據層訪問服務。我們遇到了一些確定精度的問題。JPA自動BigDecimal轉換

實體:

@Entity 
public class TestEntity{ 
    @Column(name="DECTEST", scale = 3, precision = 13) 
    BigDecimal decTest; 

} 

現在我們創建一個bean,並嘗試將其保存:

TestEntity te = new TestEntity(); 
te.setDecTest(new BigDecimal(1.2)); 

TestEntityService.save(te); 

我們得到以下錯誤:由 引起:com.ibm.db2.jcc.c .SqlException:[ibm] [db2] [jcc] [t4] [1037] [11190] BigDecimal轉換期間發生異常。詳情請參閱附件Throwable。

Caused by: com.ibm.db2.jcc.a.a: [ibm][db2][jcc][converters][608][10994] Overflow occurred during numeric data type conversion of "1.1999999999999999555910790149937383830547332763671875". 
at com.ibm.db2.jcc.a.e.a(e.java:61) 
at com.ibm.db2.jcc.b.jb.a(jb.java:1772) 
... 73 more 

問題似乎是我們的BigDecimals比例高於數據庫中的比例。

的工作解決方法是:

TestEntity te = new TestEntity(); 

BigDecimal decTest = new BigDecimal(1.2); 

te.setDecTest(decTest.setScale(3,RoundingMode.HALF_UP); 

TestEntityService.save(te); 

有了這個解決方法,我們減少BigDecimals的手動precicsion到數據庫中的一個。

但是,如果數據模型發生變化,我們必須手動調整比例。有沒有辦法讓我們的jpa/hibernate實現自動爲我們做轉換?例如。與設置屬性。無論如何,在創建bean的地方做這件事是錯誤的地方。

回答

7

你可以使用自定義的用戶類型,或者你可以簡單地實現setter方法是這樣的:

public void setDecTest(BigDecimal decTest) { 
    this.decTest = decTest.setScale(3, RoundingMode.HALF_UP)); 
} 

此舍入將因此在實體封裝。

請注意,使用double來初始化BigDecimal有點奇怪。如果要將1.2存儲在BigDecimal中,請使用new BigDecimal("1.2"),並且您將不會使用1.1999999999999999555910790149937383830547332763671875對BigDecimal進行初始化。

+0

也想到了這兩個。然而,1.2僅用於測試。它來自用戶界面,應該被驗證爲一個數字,以便沒有人可以發送「hallo」而不是數字。隨着訪問層的生成,我不想修改它。使用幾個BigDecimal屬性的手動方式並不好,但是如果沒有更好的方法出現,我們可能不得不去做。 – 2012-08-10 10:09:46

+1

你爲我解釋了一些關於不對BigDecimal的構造函數解析double的問題,讓我省了些麻煩。這是我需要拒絕的誘惑。 – 2013-06-09 20:51:24