我們正在使用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的地方做這件事是錯誤的地方。
也想到了這兩個。然而,1.2僅用於測試。它來自用戶界面,應該被驗證爲一個數字,以便沒有人可以發送「hallo」而不是數字。隨着訪問層的生成,我不想修改它。使用幾個BigDecimal屬性的手動方式並不好,但是如果沒有更好的方法出現,我們可能不得不去做。 – 2012-08-10 10:09:46
你爲我解釋了一些關於不對BigDecimal的構造函數解析double的問題,讓我省了些麻煩。這是我需要拒絕的誘惑。 – 2013-06-09 20:51:24