前两天我微博提到有个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时取不到值的问题相关推荐

  1. hibernate左连接查询时在easyUI的dataGrid中有些行取值为空的解决办法

    1 当使用left join左连连接,sql语句为 select t from SecondPage t left join t.rightNavbar n where 1=1 页面中出现了部分空行的 ...

  2. 07|Serverless运行时:使用自定义运行时支持自定义编程语言

    这一讲我将带你了解如何自定义函数运行时. 我们知道 Serverless 应用的函数代码是在 FaaS 中运行的,到目前为止,你也只能选择 FaaS 平台支持的编程语言开发应用,而 FaaS 平台支持 ...

  3. Hibernate用Mysql数据库时链接关闭异常的解决

    在一个项目中,客户要求除操作系统外全部使用免费软件,因此我使用了Mysql 4.0作为数据库服务器,其JDBC驱动为3.0.9版本,在给客户安装后调试一切正常.可是到了第二天,只要一登录就提示&quo ...

  4. 致远OA表单自定义函数(取上一行金额)

    需求探讨 前期,在我开始分享自定义函数时,有同事就建议小编研究一下取重复表上一行金额的自定义函数. 解决办法:主表中控件取出明细表金额数组,然后利用当前行的行号计算出上一行的行号,最后查找数组中对应行 ...

  5. uni-app 关于自定义标题栏时状态栏高度在不同手机的适配问题

    前端小白的uni-app艰难学习之路 解决 在自定义标题栏时,虽然可以自由定义标题栏内容了,但我们通常又会面临着状态栏也一起塌陷的情况,在普通的手机上我们通过官方提供的css变量–status-bar ...

  6. 自定义ViewGroup时子View显示不全的问题

    经检查onMeasure()和onLayout()都没有问题 最后发现原因是在onDraw()和dispatchDraw()方法上.自定义的ViewGroup加上背景就好了. Android的view ...

  7. C#里XML(JSON)序列化时,自动隐藏值为Null的成员的输出

    原文:C#里XML(JSON)序列化时,自动隐藏值为Null的成员的输出 从StackOverflow里找到的答案.发现对最新的Newtownsoft的JSON序列化也同样适用. https://st ...

  8. 在PL/SQL里直接插入日期时提示 is not a valid date and time的解决方法

    在PL/SQL里直接插入日期时提示 is not a valid date and time的解决方法 参考文章: (1)在PL/SQL里直接插入日期时提示 is not a valid date a ...

  9. hibernate里的generator中class =value介绍

    在*.hbm.xml必须声明的<generator>子元素是一个Java类的名字,用来为该持久化类的实例生成唯一的标识. <generator class="sequenc ...

最新文章

  1. MYSQL的地理信息数据库_国内为什么没有开源地理信息数据库?
  2. 【Python学习教程】:装饰器的详细教程,通俗易懂
  3. 北斗导航 | ION GNSS+ 2021、 ION GNSS+ 2020会议论文下载:ION 美国导航学会
  4. android listpreference 自定义,Android – 我的ListPreference中的自定义行布局
  5. 当Maven依赖插件位于
  6. 【数据蒋堂】第28期:迭代聚合语法
  7. mac设置python版本切换,和设置python默认版本
  8. 易语言编写的档案管理系统源码_校园固定资产管理系统方案
  9. 从零基础入门Tensorflow2.0 ----九、44.1 keras 保存模型、参数
  10. 使用Mybatis实例
  11. 腾讯管家中的壁纸无下载按钮,如何保存?
  12. 法勒二维码读头数据读写测试
  13. Ubuntu各版本代号
  14. HiTool工具烧录Uboot过程简介
  15. 强制浏览器使用webkit内核
  16. map组件如何展示marker的callout气泡
  17. Thinkpad E450 黑苹果OpenCore引导驱动包(macOS BigSur 99%完美版)
  18. Simulink建模:Simulink PWM死区时间插入仿真
  19. [JOI 2014 Final]裁剪线
  20. 关于案例式C语言上机指导与习题解答中实验4_15题的解答

热门文章

  1. JavaScript单线程
  2. git命令查看远程分支
  3. 【转载】COM 连接点
  4. 移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析html代码,更好地将移动web前端页面表现出来。本文整理一些常用的meta标签...
  5. String Split 和 Join
  6. LIst与ArrayList区别
  7. [SAP ABAP开发技术总结]CLEAR、REFRESH、FREE内表清理区别
  8. aserisk笔记(dahdi工具相关)
  9. Objective-C语法之KVC使用 有图有真相
  10. DebugHook 与 ReportMemoryLeaksOnShutdown