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

本文共 2157 字,大约阅读时间需要 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透明地关闭了会话。应用层的代码不用了解不论什么持久层逻辑,还是实现了延迟载入。

转载于:https://www.cnblogs.com/yfceshi/p/7217287.html

你可能感兴趣的文章
NodeJs实现WebSocket——express-ws
查看>>
NodeJS怎么实现WebSocket功能
查看>>
vue:axios二次封装,接口统一存放
查看>>
Js三大特性--封装、继承以及多态
查看>>
2019年8月2日07:51:10 马上要撤
查看>>
vue中router与route的区别
查看>>
js 时间对象方法
查看>>
网络请求返回HTTP状态码(404,400,500)
查看>>
Spring的JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate
查看>>
Mac下使用crontab来实现定时任务
查看>>
303. Range Sum Query - Immutable
查看>>
迪杰斯特拉算法---单源点最短路径
查看>>
【python】TCP/IP编程
查看>>
JVM 类型的生命周期学习
查看>>
图片加载失败显示默认图片占位符
查看>>
2018 ZJCPC
查看>>
【★】浅谈计算机与随机数
查看>>
[转载]宇宙文明等级的划分标准
查看>>
Jmeter的log输出控制
查看>>
《代码阅读方法与实现》阅读笔记一
查看>>