Hibernate里自定义UserType时取不到值的问题
前兩天我微博提到有個(gè)BUG出現(xiàn)了兩個(gè)月卻還沒有頭緒。這個(gè)BUG是這樣的:在Hibernate中自定義UserType,從數(shù)據(jù)庫中取值的時(shí)候,有時(shí)候這個(gè)UserType能取到值,但有時(shí)候即使數(shù)據(jù)庫有值,取到的也是null。后來負(fù)責(zé)前端的同事偶然發(fā)現(xiàn),當(dāng)數(shù)據(jù)庫中某些字段為null的時(shí)候,這個(gè)UserType就取不到值,如果把這些字段填上內(nèi)容,就可以取到了。于是這個(gè)問題就莫名其妙地解決了。后來經(jīng)過分析和測試,發(fā)現(xiàn)只要UserType的前一個(gè)字段為null,這個(gè)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),這個(gè)方法用于判斷上次從rs中取出的值是否為null。因此,如果這個(gè)UserType的前一個(gè)字段為null,這條語句就會返回null。當(dāng)時(shí)我不知道從哪copy了這份代碼,于是產(chǎn)生了這樣一個(gè)表現(xiàn)十分詭異的BUG。
要修復(fù)這個(gè)BUG是很簡單的,只需要調(diào)換nullSafeGet里前兩行代碼即可。
如果UserType是除主鍵外的第一個(gè)字段,在取值的時(shí)候還會產(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
總結(jié)
以上是生活随笔為你收集整理的Hibernate里自定义UserType时取不到值的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript对象操作总结
- 下一篇: 苹果欲借免费纳米SIM卡技术控制行业标准