net.sf.cglib.beans.BulkBeanException 解决办法

来源:互联网 发布:中文编程安卓版 编辑:程序博客网 时间:2024/05/22 14:11

最近在用 ibatis 的时候,抛出了这样一个异常,还是头一次见这个异常。对于不认识的东西第一反应就是 Google ,把这个异常原封不动的粘到搜索框中,找到了这样的一条链接:http://ibatis.10938.n7.nabble.com/problem-returning-primitive-types-from-a-query-td11676.html
在文章中找到这样一段话:
< I’m guessing the values in the database are null. If they are, the
result map types have to be wrapped - you can’t represent null in a
primitive, even with boxing.
< If that is not adequate, your other option is to make the SQL provide a default value for null values.

这段话的大意就是:
数据库中的字段有 nul 值。如果是的话, ibatis result map 中的映射类型必须是包装类型(Integer 是包装类型,int 是原生类型)。因为我们不能用 null 来代表一个原生对象(int num = null; 这样是不合法的)。
把原生类型改为包装类型还不行的话,还有个选择就是为数据库中的 null 值提供一个默认类型。

看到这里,我已经明白发生异常的原因了。数据库中的记录最终得通过 result map 映射为 Java bean ,数据库中的每一个列都映射为 bean 中的一个属性。而我的 bean 的一些属性为 int 类型,是原生类型。这些原生类型是不能被赋 null 值的,比如 int num = null;这样的代码是不合法的。问题的本质原因已经找到了,问题就好解决了。我试过老外的那两种解决办法,都能行得通。
1、把 int 改为 Integer。
2、也可以给数据库中的 null 值设置个默认值。
但我感觉这两种方法都不太好,改动比较大。大家一块写代码,怕我的改动影响到了别人的代码。为了把影响减到最小,再次 Google 了下,发现可以在 sqlMap 映射文件中给返回的 null 值设置默认的值。比如,可以这样设置:

<result column="USER_TYPE" jdbcType="INTEGER" property="userType" nullValue="-3" />

设置 nullValue=”something”。至此,问题完美解决,遇到问题,应该多动手,勤动脑,总能找到最优的解决方案。

0 0
原创粉丝点击