日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

前兩天我微博提到有個BUG出現了兩個月卻還沒有頭緒。這個BUG是這樣的:在Hibernate中自定義UserType,從數據庫中取值的時候,有時候這個UserType能取到值,但有時候即使數據庫有值,取到的也是null。后來負責前端的同事偶然發現,當數據庫中某些字段為null的時候,這個UserType就取不到值,如果把這些字段填上內容,就可以取到了。于是這個問題就莫名其妙地解決了。后來經過分析和測試,發現只要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的文檔不難發現,這個方法用于判斷上次從rs中取出的值是否為null。因此,如果這個UserType的前一個字段為null,這條語句就會返回null。當時我不知道從哪copy了這份代碼,于是產生了這樣一個表現十分詭異的BUG。

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

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

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时取不到值的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。