2012-11-12 74 views
1

我有一個通過JAXB生成的類,我嘗試在Hibernate中將它用作實體。有數字字段被定義爲Java BigIntegers。無論我如何在DB2中定義列,Hibernate都會抱怨以下幾種變體:如何將Hibernate中的BigInteger映射到DB2

列名MY_COLUMN錯誤的列類型....找到:decimal,expected:numeric(19,2)。

我試過DB2 bigints,我已經試過數字(19,2)等

我又讓休眠選擇方言。它正在選擇DB2方言。我如何在DB2中定義列以便Hibernate將允許我使用它來存儲Java BigInteger?

如果我把它定義爲在Hibernate中一個big_integer,並作爲DB2一個BIGINT,我得到:

錯列式....列MY_COLUMN發現:BIGINT,預計:數字(19,2)

UPDATE

因此,我改變hibernate.hbm2ddl.auto從驗證創建,讓Hibernate創建模式本身。從日誌中我可以看到,這是使用數字(19,2)的定義生成create table語句。在DB2中,表創建完成後,定義爲十進制(19,2)。該應用程序啓動了。

然後關閉應用程序,重新編譯設置hibernate.hbm2ddl.auto以驗證並重新啓動。

休眠出錯了與: 發現:小數,預計:數字(19,2)

所以Hibernate無法驗證它剛剛創建自己的模式?

回答

1

Hibernate架構創建,更新和驗證是不應該存在的畸變。所有這三個功能都有很多bug,並且在幾種情況下都知道會失敗,所以儘可能避免它(這就是爲什麼有些人專注於數據庫開發人員)。

關於如何存儲大整數,如果列是DB2 bigint,則可以將其映射爲長整型(均爲64位)。

如果您需要超過64位,則該列需要是一個數字,它允許整數最大爲2^81-1。 Hibernate會自動將其映射到BigDecimal或BigInteger。

如果您需要存儲更大的數字(BigInteger支持),您需要編寫自己的custom type將數字寫入varchar。

作爲一個方面說明,這是一個很糟糕的做法,用於將您用於與其他系統(您的xml對象)進行通信的對象與您用於保存的對象(兩者都是不同的域) 。我有這樣的感覺,可能也會使用相同的對象作爲你的域的一部分,這是壞的,邪惡的,它在一些國家是犯罪的:)。