假设延迟载入出现session close的情况下

方法1.在web.xml中配置spring的openSessionInViewFilter

<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>

方法2.在详细代码中

tx = session.beginTransaction();

Customer customer=(Customer)session.load(Customer.class,new));

if(!Hibernate.isInitialized(customer))

Hibernate.initialize(customer);

tx.commit();

session.close();

customer.getName();

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

即使在视图外面,Spring框架也通过使用AOP 拦截器 HibernateInterceptor来使得延迟载入变得非常easy实现。这个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和load延迟载入矛盾问题,怎样解决?的更多相关文章

  1. 第四讲 :hibernate中的session

    hibernate中的session中可以进行增删改差,通过工具类可以得到相关的工具类. 方法概要:  Transaction beginTransaction()开始一个工作单元,得到关联的事务对象 ...

  2. Hibernate中的Session

    我们之前也经常使用Session,通过连接服务器将需要保存的值存到服务器的session中,这是之前关于session的简单应用.现在看到Hibernate框架中也有关于Session的定义,该定义是 ...

  3. Hibernate中的Session对象 标签: hibernatesession 2017-01-22 22:10 238人阅读 评论(

    Hibernate中的Session 大家在看hibernate视频的时候一定都发现了,每次要操作数据库,总是要新建一个session对象,Hibernate在对资料库进行操作之前,必须先取得Sess ...

  4. 关于hibernate中的session与数据库连接关系以及getCurrentSession 与 openSession() 的区别

    1.session与connection,是多对一关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用.   2.多个sessi ...

  5. (八) Hibernate中的Session以及事务

    HibernateUtil.getSessionFactory().getCurrentSession() 和HibernateUtil.getSession() 的区别: 1.异:getCurren ...

  6. Hibernate中的Session缓存问题

    1. Session 缓存: 1) . 在 Session 接口的实现中包括一系列的 Java 集合 , 这些 Java 集合构成了 Session 缓存 .          它用于存放 Sessi ...

  7. Hibernate-ORM:04.Hibernate中的get()和load()

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客会讲如何用get()或load()查询单个对象和对缓存的简单操作,以及他俩的区别和相同(前面有的那些配 ...

  8. Hibernate中的session对象update方法的使用

    使一个游离对象转变为持久化对象.例如以下代码在session1中保存了一个Customer对象,然后在session2中更新这个Customer对象: Customer customer = new ...

  9. hibernate 中的session和事务(Transaction)

    在使用hibernate开发时,遇到最多的就是session与事务,那么他们两个有什么关系呢?下面我来抛砖引玉: 1.session是hibernate中的以及缓存机制,是用来对数据进行增删改查的一个 ...

随机推荐

  1. Selenium WebDriver-通过断言页面是否存在某些关键字来确定页面按照预期加载

    #encoding=utf-8 import unittest import time import chardet from selenium import webdriver class Visi ...

  2. dev c++ 提示没有iostream.h文件

    dev c++ 提示没有iostream.h文件 解决办法路径没有打通最好是这样写:#include <iostream>using namespace std;int main(int ...

  3. 02 Java 的基本类型

    Java 的基本类型 Java 包括了八种基本类型,明细如下: Java 的基本类型都有对应的值域和默认值.byte,short,int,long,float以及double的值域依次扩大,前面的值域 ...

  4. curl保存图片

    $url = 'http://p1.qhimg.com/t013dfc89f8a039122c.jpg?size=690x460'; function http_get_data($url) { $c ...

  5. Spring整合Junit进行单元测试

    I. 加入依赖包 Spring Test (如spring-test-2.5.4.jar) JUnit 4 Spring 其他相关包 II.新建Junit Test Case III.读取配置文件 @ ...

  6. 浅谈android反调试之 转发端口

    反调试方案: 我们最通常使用的动态工具是IDA, IDA的动态调试端口默认为23946,我们可以通过/pro/net/tcp 查看android 系统所有TCP Socket 启动android_se ...

  7. 如何查找Windows上安装的DB2的端口号Port

    1.db2com打开控制台 2.db2 get dbm cfg 可以通过db2 get dbm cfg,查询数据库管理器配置参数,就可以查到端口号或端口名. 示例: $ db2 get dbm cfg ...

  8. P1108 低价购买 (动态规划)

    题目链接 Solution 似乎就是个很简单的最长不上升子序列输出方案. 但是有一个很艹蛋的条件: 不同方案选择价格必须不同. 且其股票价格不保证不相同. \(f[i]\) 代表以第 \(i\) 天结 ...

  9. Windows connect to mysql failed: can't get hostname for your address

    My mysql is on Linux platform. When I used my laptop connect to mysql, I got error message like &quo ...

  10. 优化join语句

    Mysql4.1开始支持SQL的子查询.这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中.使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的 ...