`
woaiyingyu123
  • 浏览: 71168 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

Spring管理Hibernate的延迟加载配置(OpenSessionInViewFilter)

阅读更多
当我们使用延迟加载,但是如果用Spring管理Hibernate,那么每次操作都会关闭Session。这样触发延迟加载就会导致session已经关闭的错误。但是如果我们不使用延迟加载,那么表的关联关系一旦很庞大,数据很多。那么效率也是个不可忽视的问题。进入正题。
(1)web.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	<!-- Spring管理延迟加载的配置 -->//这个顺序很重要,放在Struts2的配置的上方,这个小细节困扰了我很久。。。不知道是否正确,反正我实验成功
	<filter>
		<filter-name>hibernateFilter</filter-name>
		<filter-class>
			org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
		<init-param>
			<param-name>sessionFactoryBeanName</param-name>
			<param-value>sessionFactory</param-value>//sessionFactory的Bean的名字
		</init-param>
		<init-param>
			<param-name>singleSession</param-name>
			<param-value>true</param-value>//默认为true,如果为false,等于没用OpenSessionInView,默认为true,所以这个初始化参数可以省略的
		</init-param>
		<init-param>
			<param-name>flushMode</param-name>
			<param-value>AUTO</param-value>//设为自动
		</init-param>

	</filter>
	<filter-mapping>
		<filter-name>hibernateFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- Struts2的配置 -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- Spring管理配置 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
</web-app>
//在这里简单介绍flushMode的几个属性:
 (1)NEVEL,已经废弃了,被MANUAL取代了
 (2)MANUAL,spring3.x中的opensessioninviewfilter已经将默认的FlushMode设置为MANUAL了;如果FlushMode是MANUAL或NEVEL,在操作过程中hibernate会将事务设置为readonly,所以在增加、删除或修改操作过程中会出现如下错误
(3)AUTO,设置成auto之后,当程序进行查询、提交事务或者调用session.flush()的时候,都会使缓存和数据库进行同步,也就是刷新数据库
(4)COMMIT,提交事务或者session.flush()时,刷新数据库;查询不刷新
(5)每次进行查询、提交事务、session.flush()的时候都会刷数据库
这里需要说一下和AUTO的区别,当hibernate缓存中的对象被改动之后,会被标记为脏数据(即与数据库不同步了)。当session设置为FlushMode.AUTO时,hibernate在进行查询的时候会判断缓存中的数据是否为脏数据,是则刷数据库,不是则不刷,而always是直接刷新,不进行任何判断。很显然auto比always要高效得多。


(2)spring的sessionFactory配置:(applicationContext.xml)
<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource">
			<ref bean="bbsDateSource" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
				<prop key="hibernate.show_sql">true</prop>
			</props>
		</property>
		<property name="packagesToScan">
			<value>com.xxx.entity</value>
		</property>
	</bean>
//这个配置在Spring配置的文章上有了介绍,请参照。

如果有什么不足的请留言,共同学习,共同进步!还有一点,需要加上Spring事务,这样才能刷新(这个只是我个人遇到的问题,这里说一下给大家,不知道是否正确,否则改天弄来弄去还是不成功,那就郁闷啦。呵呵~)。
分享到:
评论

相关推荐

    Struts,Spring与hibernate集成

    10. **处理Hibernate延迟加载问题**:为了解决由于Session生命周期和HTTP请求生命周期不匹配导致的延迟加载问题,可以使用OpenSessionInViewFilter。这个过滤器确保Session在请求结束时才关闭,从而能正确处理延迟...

    struts_hibernate_spring集成

    - **OpenSessionInViewFilter**:此过滤器确保在视图渲染过程中保持一个打开的Hibernate Session,这对于事务管理和延迟加载特别有用。 #### 2. struts-config.xml的配置调整 在Struts配置文件中,为了与Spring...

    Struts+hibernate+Spring的整合

    10. **延迟加载问题**:为了处理Hibernate的延迟加载问题,可以使用Spring的`OpenSessionInViewFilter`。这个过滤器确保在一次HTTP请求的整个生命周期内,Hibernate的Session保持打开状态,允许延迟加载在请求结束时...

    Struts+Hibernate+Spring的整合方法

    8. **处理Hibernate延迟加载**:使用`OpenSessionInViewFilter`过滤器,确保Session在整个HTTP请求期间保持打开状态,解决懒加载问题。配置过滤器映射到所有.do请求。 9. **处理只读模式异常**:由于...

    懒加载异常解决.docx

    例如,在Hibernate中查询一个对象并尝试访问其延迟加载的关联对象时,如果没有正确的Session管理机制,就可能会引发此类异常。 **具体原因包括:** 1. **Session过早关闭:** 如果在事务或请求结束时关闭了Session...

    Hibernate4.1环境搭建

    - `excludeProperties`参数用于指定哪些属性不应该被包含在最终输出的JSON数据中,这对于避免Hibernate的延迟加载问题非常有用。 #### 三、总结 通过上述步骤,我们可以成功地搭建起Spring4.1 + Hibernate4 + ...

    hibernate资料

    为了避免这个问题,可以关闭特定属性的延迟加载(在映射文件中设置 lazy="false"),或者使用 Spring 的 OpenSessionInViewFilter 过滤器来确保 Session 在整个请求生命周期内保持打开状态。 【Hibernate 的查询...

    hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法

    为了解决这个问题,我们可以使用 Spring 提供的一个支持类OpenSessionInViewFilter,这个类可以在发起一个页面请求时打开 Hibernate 的 Session,并保持这个 Session 的生命周期,直到这个请求结束。这样可以确保 ...

    Spring配置总结

    - **配置延迟加载时使用OpenSessionInView**: OpenSessionInView是一种技术,用于解决Hibernate在多线程环境下的一级缓存问题。通过在web.xml中配置`OpenSessionInViewFilter`,可以实现持久化层的事务与视图渲染...

    搭建SSH框架总结.doc

    在Eclipse中配置好数据库连接,并选择使用Spring配置文件来管理Hibernate。这允许Spring管理和初始化Hibernate SessionFactory,实现事务管理。 3. **Struts框架**:选择Struts 1.2或更高版本进行导入。Struts是MVC...

    过滤器对于session周期的控制

    综上所述,`OpenSessionInViewFilter`是Spring提供的一个强大工具,用于简化Hibernate中Session的生命周期管理。通过正确配置此过滤器,可以在不影响应用程序性能的前提下,有效地支持Lazy Loading机制。这对于提高...

    Spring学习笔记

    opensessionInViewFilter是Spring提供的一个过滤器,它用来保证在整个请求过程中开启的Hibernate Session不被关闭,直到视图渲染完毕,从而解决懒加载问题。 16. 架构模型: 课程内容中提到了不同层次的架构模型,...

    java面试宝典

    此外,SessionFactory的创建和管理可以通过Spring的配置文件来控制。 2. **Struts2和Spring的核心控制器** - **Struts2** 的核心控制器是 `StrutsPrepareAndExecuteFilter`,它负责处理HTTP请求并调用Action。 -...

    SSH配置模板[总结].pdf

    - `&lt;filter-class&gt;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;/filter-class&gt;`:OSIV模式允许在视图层(如JSP)处理请求时仍然保持数据库会话,以解决延迟绑定问题。`...

    S2SH xml配置文件

    - `OpenSessionInViewFilter`过滤器可以开启Hibernate的延迟加载功能,使得在一个HTTP请求范围内保持Hibernate Session的打开状态。 ```xml &lt;filter-name&gt;lazyLoadingFilter *.action ``` - 此段配置将`...

    S2SH集成 案例

    在这个案例中,Hibernate的SessionFactory可能被Spring管理,通过OpenSessionInViewFilter来保证每个HTTP请求都有一个活跃的Hibernate Session,从而解决延迟加载问题。 OpenSessionInViewFilter是一个重要的组件,...

    错误及解决方案.pdf

    这表明开发者需要理解对象的生命周期管理、延迟加载(懒加载)机制以及Hibernate和Spring的集成配置。 知识点一:延迟加载异常(LazyInitializationException) 在Hibernate框架中,延迟加载是一种常见的性能优化...

    三大框架整合常见问题

    在使用Hibernate时,经常会出现`LazyInitializationException`异常,这主要是因为Hibernate的延迟加载特性导致的。 **具体问题:** - 在上述代码片段中,使用`OpenSessionInViewFilter`过滤器来实现Session的自动...

    java程序中的延时加载异常及解决方案

    当我们在事务外部,比如在控制器层或视图层尝试访问这些延迟加载的属性(如`Student`的`name`属性,而不是唯一的`studentId`)时,由于Hibernate的Session已经关闭,尝试初始化延迟加载对象会导致异常,通常表现为`...

Global site tag (gtag.js) - Google Analytics