Hibernate懒加载问题

刚开始接触这种数据持久化框架时,使用的是Maybatis,相较于最原始的JDBC+SQL模式,Maybatis简直就是神器,特别是在用过Maybatis动态SQL后,简直就开始对Maybatis爱不释手。后来工作要求,又接触到了Hibernate,刚入手时,还是很不适应的,感觉这个持久化框架已近偏离传统的SQL模式,一切都只能重新学习。用过一段时间Hibernate后才发现了它的便利性。

之前问过公司的大佬,为啥要用Maybatis,得到的答案:是出于性能的要求,由于数据量庞大,轻便的Maybatis在性能上表现的更加优异。不过后来,随着对Hibernate认识的加深,才发现Hibernate在性能上也并没有落下。比如懒加载就很好的解决了Hibernate性能方面的一些问题。在配置映射时,我们不可能说像Maybatis一样哪次用什么我们就查什么,Hibernate的映射必须是完整的。所以这就导致了每次Hibernate加载时都会更具映射关系把所有关联数据查询出来。但是其中很多可能是我们并不需要的。这就浪费了很多的系统资源,而Hibernate懒加载就很好的解决了这个问题,通过代理的方式,在你查询一个对象时,Hibernate并不会立马去查询数据库,而是生成一个代理对象,当你要获取对象的属性(字段)值时,才会去真正的查询对象。不得不说这很有效。

但是这种方式也存在一个问题,就是拿到代理对象后,session忽然关闭了,这时再想去执行查询的时候,就查不到数据了。而且还会抛出org.hibernate.LazyInitializationException。

一般来说这种问题是很容易被发现的,但是有些Hibernate项目经常是使用了AspectJ来进行切面处理的,这就使得LazyInitializationException不那么容易被发现了。可能自己查到了一个对象,传给了某个方法,之后再来获取对象的属性时就报错了。

知道了原因就很好解决这个问题了,我们只要在原来的回话被结束掉之前把对象的相关属性拿出来,再去使用,这样就不会有问题了。或者直接改映射文件的配置(不推荐)。

展开阅读全文

没有更多推荐了,返回首页