ibatis懒加载导致对象json化失败,ibatis和hibernate的懒加载对比

因为今日一个系统采用ibatis作为持久化框架,而与web层传递参数的时候又是用的json,结果用了ibatis的持久化后出现了一个问题。

就是在objectToJson的时候报空指针异常。

 

看下面的情况。比如一个类:

 

 


ibatis在懒加载zz的时候,此时zz是具有一个代理对象的,所以json转化的时候函数认为这个对象是存在的,所以依然去执行get方法进行
转化。但实际上是,加入此时zz实际上为空,也就是代理对象返回的实际对象是空,那么就会报上面所说的nullException了。相信只要用了1对1映射采用懒加载的情况下都会出现这种问题

如何解决这个问题了:
1-不用懒加载
2-查询对象的时候dao方法都不返回null,只返回一个空对象。//这个貌似会影响业务数据,暂时不考虑这么做
3-修改json-lib源码。这里有一个修改json plugin的例子:
不知道还有没有其他更好的解决方法。


* 这种代理对象的懒加载照成的问题除了上面这个之外呢,还有个问题就是你想直接在dd这个list里面add,是不行的。只能把这个list里面的数据全部取出,放到另外一个list,然后再重新setDd(list);


-------------------------
于是还顺便复习了一下hibernate的懒加载。在这里再总结一下

对于上面那个Student对象:

hibernate的懒加载:3种
第1种-就是懒加载Student类本身
第2种-就是懒加载zz;
第3种-就是懒加载dd;
分别配在Student.hbm.xml配置文件里面对应的xml元素属性上,可以配置fetch方式,对于第3种还可以配置cache。

ibatis的懒加载呢:1种
第1种-就是懒加载dd。

如何实现在web时才去取到懒加载的值。

原理:
在返回渲染页面的时候,jsp会去把jsp页面上嵌入的java程序读出来,标签,<%%>,el表达式这些。这些东西里面必然写了你想读出的属性,虽然不一定立刻就显示。但此时懒加载就会去加载实际的值(运行sql)。准备好数据后再完成页面渲染。并不是说你后面点击页面某个按钮在本页面的一个div中显示一下某对象懒加载的值的时候才去运行sql的。

hibernate:
hibernate的懒加载必须保持session打开,所以只有使用openSessionInVew。
如果用spring集成呢,直接用spring提供的OpenSessionInViewFilter ,OpenSessionInViewFilter 适用于 Service 层使用HibernateTransactionManager 或 JtaTransactionManager 进行事务管理的环境。

ibatis:
ibatis直接就可以!当然,如果一直留到渲染页面的时候才懒加载的话,也是在页面渲染前准备数据,运行半天sql。
------------------------------
附:openSessionInVew时序图

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值