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而已