我们在项目中一般都会使用Spring来管理Hibernate的session,
但是在查询数据的时候默认会使用lazy-loading方式的,也就是通常所说的延迟加载,延迟加载方式不同于普通加载,他会在使用到数据的时候才回真正的发出SQL语句,而Spring会自动的关闭session的,那么我们在前端页面做展示的时候问题就来了,我们在后台的时候还没有发出SQL查询session就关闭了,到了前台,需要数据了,这个时候程序就会发出SQL了,但是此时的session已经关闭了,当然就会报错了
解决办法:在Spring中提供了这么一个类,OpenSessionInViewFilter,这个类在上面提到的错误中就有很大的作用了,它会对客户端每次请求分配一个session,将请求结果返回给客户端,并且在完成展现后关闭session。这个类是一个过滤器,在我们配置的URL中就会使用它了,在看看上面的原因,问题不就解决了吗?前端在数据展现完了Spring才回去关闭session,那么就不会有因为延迟加载而报session已经关闭的错误了,
具体做法:既然是Filter,那么肯定是在web.xml中配置了,
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意我这里的映射地址啊,你可以根据你的实际项目需求来制定,我这里的/*指的是每一个请求都会这样。
好了, 问题解决了。希望对出现这个问题的朋友有帮助吧!
这篇文章不错:
http://hi.baidu.com/%CE%E2_%F0%A9/blog/item/f213ec354efaf9315bb5f5c3.html
分享到:
相关推荐
Hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法可以通过使用 OpenSessionInViewFilter 或者 Hibernate 的 initialize 方法来解决。这些方法可以确保 Hibernate 的懒加载特性能够正常工作,从而提高应用程序...
Java Ehcache 是一款高效、流行的开源缓存解决方案,主要用于提高应用程序的性能和响应速度。它在Java应用程序中扮演着至关重要的角色,通过存储经常访问的数据,避免了每次请求时都去数据库或者其他慢速数据源中...
Hibernate中get和load的区别:get是立即加载,load是延迟加载。 Hibernate、Ibatis、Jdbc三者的区别:Hibernate和Ibatis都是JDBC的封装框架,但Hibernate是全自动的ORM映射,而Ibatis是半自动的。 Hibernate的运行...
- **load**:延迟加载,如果找不到对象返回`null`。 ##### Hibernate、Ibatis、Jdbc三者的区别 - **Hibernate**:全ORM框架,简化了数据持久化操作。 - **iBatis**(MyBatis):半ORM框架,需要手动编写SQL语句。 -...
这种机制允许我们延迟加载某些不常用的类或者处理未知类型的对象。JVM提供`ClassLoader`类来实现动态加载,只有在实际需要使用某个类时,才会尝试加载它。即使类不存在,编译期间也不会报错,但会在运行时抛出异常。...
- **load**:延迟加载对象,如果找不到记录,则返回null。 ##### Hibernate、Ibatis、Jdbc三者的区别 - **Hibernate**:全ORM解决方案,自动管理对象的生命周期。 - **MyBatis (原Ibatis)**:半ORM框架,提供动态...