日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Hibernate里自定义UserType时取不到值的问题

發(fā)布時間:2025/3/20 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate里自定义UserType时取不到值的问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前兩天我微博提到有個BUG出現(xiàn)了兩個月卻還沒有頭緒。這個BUG是這樣的:在Hibernate中自定義UserType,從數(shù)據(jù)庫中取值的時候,有時候這個UserType能取到值,但有時候即使數(shù)據(jù)庫有值,取到的也是null。后來負責前端的同事偶然發(fā)現(xiàn),當數(shù)據(jù)庫中某些字段為null的時候,這個UserType就取不到值,如果把這些字段填上內(nèi)容,就可以取到了。于是這個問題就莫名其妙地解決了。后來經(jīng)過分析和測試,發(fā)現(xiàn)只要UserType的前一個字段為null,這個UserType就肯定取不到值。UserType的代碼是這樣的:

public class GenderUserType extends StringUserType {public Class returnedClass() {return Gender.class;}public Object nullSafeGet(ResultSet rs, String[] names, Object owner)throws HibernateException, SQLException {if (rs.wasNull()) return null;String gender = rs.getString(names[0]);return Gender.valueOf(gender);}public void nullSafeSet(PreparedStatement st, Object value, int index)throws HibernateException, SQLException {if (value == null) {st.setNull(index, SQL_TYPE);}else {String gender = ((Gender)value).toString();st.setString(index, gender);}} }

您能看出問題在哪了嗎?對了,就是nullSafeGet里的if (rs.wasNull()) return null;這句。查看wasNull的文檔不難發(fā)現(xiàn),這個方法用于判斷上次從rs中取出的值是否為null。因此,如果這個UserType的前一個字段為null,這條語句就會返回null。當時我不知道從哪copy了這份代碼,于是產(chǎn)生了這樣一個表現(xiàn)十分詭異的BUG。

要修復這個BUG是很簡單的,只需要調(diào)換nullSafeGet里前兩行代碼即可。

如果UserType是除主鍵外的第一個字段,在取值的時候還會產(chǎn)生“sqlexception 未讀取數(shù)據(jù)”的異常。

http://topic.csdn.net/u/20110713/22/5b9384fa-91ff-4086-a83c-90c89b355e19.html

http://ytffhvk.iteye.com/blog/169306

http://rayleeya.iteye.com/blog/365237

總結

以上是生活随笔為你收集整理的Hibernate里自定义UserType时取不到值的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。