1. 程式人生 > >org.hibernate.TypeMismatchException異常解決方案

org.hibernate.TypeMismatchException異常解決方案

今天剛開始做專案,第一個測試就出現了問題,拋的異常是TypeMismatchException (型別不匹配異常),

問題出現的原因:oracle資料庫中建立id的時候id的型別是integer型別的,但是在用MyEclipse反向生成的時候,對映的實體類的id型別為BigDecimal型別的,如果在通過id查的時候,傳的是int型別的,而實體類對映的是BigDecimal型別的,在dao中封裝的方法的id也是integer的,型別肯定不會。

解決的方法:

(1)   我把封裝的findById方法中的id的型別該成了Serializable型別的了

因為Serializable型別的在jdk5.0以上支援id為string、int型別的,原因是jdk1.5以上的支援了自動裝箱的過程,int會自轉換為Integer,而Integer是實現了Serializable的。

(2)   在傳值的時候把BigDecimal型別轉換為int型別的。

int bd = new BigDecimal(1).intValue();這句話來轉換為int型別的,再通過裝箱的過程去傳值。

這樣問題就解決了。

主要是型別匹配就ok了

通過這個異常,通過查手冊,學習到了一點知識:

當在資料庫中指定型別的時候,如果指定的number(4),則在反向的時候就是Short型別的,也就是說number根據不同的位元組,反向的值的型別不同,但是都是Number的子類。

Number 的子類必須提供將表示的數值轉換為 byte、double、float、int、long 和 short 的方法。

抽象類 Number 是 BigDecimal、BigInteger、Byte、Double、Float、Integer、Long 和 Short 類的超類。

下面的是對Serializable使用的解釋,從網上查的:

物件序列化是為了反序列化用的
比如將一個物件寫入到檔案,或者作為流的形式傳給第三方,那麼這個類必須實現Serializable介面,並且定義一個私有的常量SerializableID,不然就不能從檔案中讀取物件了,接收方也沒法還原這個物件

或者:

不是說特定或好處,是有作用的

比如你定義了一個Student類,裡面定義了一個SerializableID=5,序列化後傳給我,我將其存到資料庫以後再使用

若干天后,系統升級,你在Student類加了一個欄位String address,如果Student裡沒有定義SerializableID或者SerializableID不一樣了,我存在資料庫裡的Student物件就反序列化不回來了

如果定義了SerializableID,即使你在Student里加了一個屬性,我存在資料庫的物件少一個屬性,但還是可以反序列化回來的,只是新加的那個屬性值為null而已