对于hibernate懒加载模式报错处理

来源:互联网 发布:安卓去广告软件 编辑:程序博客网 时间:2024/06/18 10:59

在开发项目的过程中碰到了一些和hibernate懒加载有关的错误,记录一下。


在实际开发中,我们常常会将两个表关联起来(设置外键),这在hibernate映射为对象时会变成两个对象关联(即一个对象有另一个对象的引用),这本来是一个非常好用的机制,但是因为hibernate的懒加载模式,导致我们开发过程中会遇到各种坑。


什么是懒加载模式:就是hibernate在查询数据库的时候会将非引用变量(没有外键的)正常查询出来,但是对于引用变量(外键),hibernate不会全部查询出来,而是放了个代理对象,在你要用到它的时候才去查询,减少开销。但是,问题就在这,我们每次查询结束都会把session给关了,然后在以后用到引用的对象时,hibernate发现session已经被关闭,就报了个错 session没找到的错误。

1.在jsp页面使用ognl或者el表达式取关联对象时报错

可以配置一个hibernate的过滤器,告诉hibernate什么时候request结束,将session的关闭延时到request请求结束。

    <!-- 把session的关闭延迟到jsp页面显示之后,解决hibernate懒加载无问题,在配在struts2上面。-->  <filter>    <filter-name>openSessionInViewFilter</filter-name>    <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>    <init-param>      <param-name>singleSession</param-name>      <param-value>true</param-value>    </init-param>  </filter>  <filter>    <filter-name>struts2</filter-name>    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  </filter>  <filter-mapping>    <filter-name>openSessionInViewFilter</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping>  <filter-mapping>    <filter-name>struts2</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping>

2.ajax请求时,使用插件对对象进行序列化出错

这个问题发生的原因也是和上面的差不多,不过区别的是上面的配置无法解决这个问题,具体原因我也不知道,但是,我有一个比较笨的解决办法:可以给不需要的数据的getter方法设置注解@JSON(serialize = false),这样就不会将该属性序列化。对必须要用的数据又是引用变量的关闭懒加载模式@ManyToOne(fetch = FetchType.EAGER)

原创粉丝点击