博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate中的session和load延迟载入矛盾问题,怎样解决?
阅读量:7187 次
发布时间:2019-06-29

本文共 2106 字,大约阅读时间需要 7 分钟。

假设延迟载入出现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 Long(1));
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透明地关闭了会话。应用层的代码不用了解不论什么持久层逻辑,还是实现了延迟载入。

转载地址:http://gzykm.baihongyu.com/

你可能感兴趣的文章
Session,Cookie的问题
查看>>
记录前端遇到的坑
查看>>
Matlab查看数值不用科学计数法显示
查看>>
C# 读取资源文件.resx 中的xml资源
查看>>
python版mapreduce题目实现寻找共同好友
查看>>
ASP.NET Ajax组件介绍
查看>>
webpack
查看>>
应用程序动态全屏和退出全屏
查看>>
索引的删除和更新
查看>>
2017广东工业大学程序设计竞赛决赛 Problem E: 倒水(Water) (详解)
查看>>
概率题--笔试
查看>>
深度学习实战-强化学习-九宫格 当前奖励值 = max(及时奖励 + 下一个位置的奖励值 * 奖励衰减)...
查看>>
DS博客作业——树
查看>>
抽象工厂模式
查看>>
ural 1261. Tips(进制运算)
查看>>
tomcat安装与配置
查看>>
(5).plus(3).minus(2);
查看>>
Mevan 初涉
查看>>
猴子分桃
查看>>
Django框架之templates(模板)系统
查看>>