Hibernate 延迟加载机制详解
Hibernate 对象关系映射提供延迟与非延迟的对象初始化策略。非延迟加载在读取对象时会一并加载所有关联对象,可能导致大量 SELECT 语句执行,影响性能。延迟加载则仅在调用关系属性时才加载数据,显著提升性能。但延迟加载要求 Hibernate 会话在使用对象时保持开启,这在 DAO 模式抽象持久层时可能引发问题。
解决方案:OpenSessionInView
在 Web 层,可通过 Spring 的 OpenSessionInViewFilter 或 OpenSessionInViewInterceptor 解决会话管理问题。它们将当前会话绑定到线程,确保在视图渲染期间延迟加载能够正常进行。一旦请求结束,会话自动关闭。
配置示例
Interceptor 配置
<beans>
<bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate.support.OpenSessionInViewInterceptor">
<property name="sessionFactory"><ref bean="sessionFactory"/></property>
</bean>
</beans>
Filter 配置
<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>
hibernateFilter
*.do


