`

Hibernate延迟加载带来的session close的解决方法

阅读更多

如果延迟加载出现session close的情况下可以在web.xml中配置springopenSessionInViewFilter

<filter>
 <filter-name>hibernateFilter</filter-name>
 <filter-class>
 org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
 </filter-class>
</filter>
<filter-mapping>
 <filter-name>hibernateFilter</filter-name>
 <url-pattern>*.do</url-pattern>
</filter-mapping>

这样就可以解决了;

或者可以这样:

tx = session.beginTransaction();
Customer customer=(Customer)session.load(Customer.class,new Long(1));
if(!Hibernate.isInitialized(customer))
Hibernate.initialize(customer);
tx.commit();
session.close();
customer.getName();

在业务逻辑层中使用延迟加载

即使在视图外面,Spring框架也通过使用AOP 拦截器 HibernateInterceptor来使得延迟加载变得很容易实现。这个Hibernate 拦截器透明地将调用配置在Spring应用程序上下文中的业务对象中方法的请求拦截下来,在调用方法之前打开一个Hibernate会话,然后在方法执行完之后将会话关闭。让我们来看一个简单的例子,假设我们有一个接口

BussinessObject:
public interface BusinessObject {
public void doSomethingThatInvolvesDaos();
 }
类BusinessObjectImpl实现了BusinessObject接口:
 
public class BusinessObjectImpl implements BusinessObject {
public void doSomethingThatInvolvesDaos() {
// lots of logic that calls
// DAO classes Which access
// data objects lazily
 }
 }

通过在Spring应用程序上下文中的一些配置,我们可以让将调用BusinessObject的方法拦截下来,再令它的方法支持延迟加载。看看下面的一个程序片段:

<beans>
<bean id="hibernateInterceptor" class="org.springframework.orm.hibernate.HibernateInterceptor">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="businessObjectTarget" class="com.acompany.BusinessObjectImpl">
<property name="someDAO"><ref bean="someDAO"/></property>
</bean>
<bean id="businessObject" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target"><ref bean="businessObjectTarget"/></property>
<property name="proxyInterfaces">
<value>com.acompany.BusinessObject</value>
</property>
<property name="interceptorNames">
<list>
<value>hibernateInterceptor</value>
</list>
</property>
</bean>
</beans>

 businessObject被调用的时候,HibernateInterceptor打开一个Hibernate会话,并将调用请求传递给 BusinessObjectImpl对象。当BusinessObjectImpl执行完成后,HibernateInterceptor透明地关闭了会话。应用层的代码不用了解任何持久层逻辑,还是实现了延迟加载。

分享到:
评论

相关推荐

    Hibernate(session管理)

    完成操作后,务必调用Session的close()方法关闭Session,释放数据库连接,防止资源泄露。 3. **事务管理**:在Session中进行的数据库操作通常需要包裹在Transaction中。我们可以使用Session的beginTransaction()...

    hibernate和session学习

    `load()`在延迟加载机制中更为常用。 4. `query()`: 通过HQL(Hibernate Query Language)或Criteria API执行查询操作,HQL是面向对象的查询语言,类似于SQL,但更加面向Java对象。 下面是一个简单的使用示例: ``...

    Hibernate中get和load方法的区别以及close(),clear()、evict()等的区别

    在Hibernate框架中,Session是与数据库交互的主要接口,它提供了多种方法来操作对象的状态和数据。本文主要讨论了`get`、`load`方法以及`flush`、`clear`、`evict`等方法的区别。 首先,让我们关注`get`和`load`的...

    jdbc_Hibernate总结

    `load`方法采用延迟加载机制,只有在真正使用对象时才会执行SQL,而`get`方法则立即执行查询。`flush()`、`clear()`和`close()`方法分别用于清理缓存并执行SQL(但不提交)、清空缓存和回滚事务,以及清空缓存并提交...

    ssh 分页代码(延迟加载)

    在IT行业中,SSH(Spring、Struts、Hibernate)是一个经典的Java Web开发框架组合,而这里的"ssh 分页代码(延迟加载)"指的是在SSH框架下实现分页查询时采用的延迟加载技术。延迟加载是一种优化策略,它允许我们在...

    hibernate小白极简实例

    Hibernate支持懒加载,允许延迟加载关联的对象,以提高性能。`@OneToMany`, `@ManyToOne`, `@OneToOne`等注解可以定义关联关系,`fetch=FetchType.LAZY`启用懒加载。级联操作(`cascade=CascadeType.ALL`)使得对父...

    hibernate源代码的zip文件

    Hibernate采用懒加载策略,延迟加载关联对象,直到真正使用时才加载。这通过代理机制实现,例如,当访问一个设置了懒加载的一对多关系时,实际加载的是代理对象,只有在调用其属性时才会触发数据库查询。 七、事务...

    hibernate的jar包

    - 支持延迟加载(Lazy Loading):只在真正需要时才加载关联的对象,减少数据库交互次数。 3. 使用Hibernate的jar包: - 将下载的hibernate压缩包解压,会得到多个jar文件,包括hibernate-core、hibernate-...

    Hibernate的MySql查询.rar

    另外,Hibernate的 Criteria API 还可以配合DetachedCriteria使用,实现延迟加载(Lazy Loading),这对于处理大数据量时的性能优化至关重要。延迟加载允许我们在需要时才加载关联的对象,避免一次性加载大量数据...

    hibernate面试题大全

    Hibernate的延迟加载机制是指在查询数据时,数据并不会立即加载到内存中,而是等到应用程序真正需要操作数据时才加载,这一机制有效减少了服务器内存的使用,提升了服务器性能。 ### Hibernate中实现类间关系的方法...

    Hibernate开发指南

    为了提高性能,Hibernate提供了一些策略和工具,如缓存机制、延迟加载、批量操作等。二级缓存可以缓存已查询过的对象,减少对数据库的访问;懒加载可以在需要时才加载关联的对象,避免一次性加载大量数据;批处理...

    hibernate核心代码

    10. **延迟加载(Lazy Loading)**: Hibernate 的懒加载机制可以在需要时才加载关联对象,提高性能。 通过以上关键点,我们可以理解Hibernate的核心运作机制,从而高效地进行数据库操作。在实际开发中,还需要...

    Eclipse Hibernate基本配置及简单实现

    **Eclipse Hibernate基本配置及简单实现** 在Java开发中,Hibernate是一个非常流行的持久化框架,它简化了数据库...在实际项目中,还可以进一步学习和应用Hibernate的高级特性,如缓存、延迟加载等,以提升应用性能。

    hibernate中文文档

    - **懒加载**:延迟加载关联对象,只在真正需要时才从数据库加载。 - **读取策略**:选择合适的读取策略(如 Immediate 或 Lazy),以优化数据加载过程。 #### 八、高级特性 ##### 8.1 多租户支持 Hibernate 支持...

    Hibernate框架搭建及数据库相关操作

    7. **实体生命周期**:Hibernate 提供了预加载、加载、持久化、更新、删除、脱管等状态以及相应的回调方法。 通过这个基础教程,你可以了解 Hibernate 框架的基本用法,但要成为 Hibernate 高手,还需要深入学习其...

    Hibernate使用指南tutorial

    - **懒加载**:延迟加载策略可以在需要时才加载关联对象,提高性能。 - **级联操作**:可以设置级联关系,使得对父对象的操作自动影响到子对象。 - **投影与分页**:使用HQL或Criteria API实现复杂查询,包括投影...

    hibernate Maven仓库资源

    10. **性能优化**:包括延迟加载、批处理更新、连接池配置等,都是提升Hibernate应用性能的关键。 综上,"hibernate Maven仓库资源"主要涵盖了如何在Maven项目中配置和使用Hibernate,以及Hibernate的基本操作和...

    hibernate连接oracle

    Hibernate还支持 Criteria 查询、HQL(Hibernate Query Language)、事务管理、级联操作、延迟加载等高级特性,这些都是提高开发效率的重要工具。 通过以上步骤,你就可以在Java应用中使用Hibernate连接Oracle...

    韩顺平.2011版.hibernate笔记.zip

    9. 性能优化:最后,笔记会探讨一些Hibernate的性能优化技巧,如批处理、缓存策略、延迟加载的合理使用等,以提高应用程序的运行效率。 总之,《韩顺平.2011版.hibernate笔记》全面地介绍了Hibernate的各个方面,...

Global site tag (gtag.js) - Google Analytics