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时取不到值的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript对象操作总结
- 下一篇: 苹果欲借免费纳米SIM卡技术控制行业标准