在使用Hibernate的load方法时,hibernate认为该对象id在数据库中已经存在,因此他创建了一个代理对象返回给我们,这时还没去数据库获取我们想要的数据,就关闭了session。有可能我们在v层我们才需要访问对象的其他属性,这时候尝试去访问数据库,因此会报lazy初始化异常的Exception。这种问题的解决办法有很多种:
第一种方法:通过HibernateCallBack来实现
public Manager get(final Integer id)
{
return getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Manager mgr=(Manager)session.load(Manager.class,id);
return mgr;
}
});
}
hibernateCallback使得hibernateTemplate里可以按照hibernate方式来操作数据库。
方法二:
比较典型的是在MVC模式中,我们在M层调用持久层获取数据时(持久层用的是load方法加载数据),当这一调用结束时,session随之关闭,而我们希望在V层使用这些数据,这时才会迫使load加载数据,我们就希望这时的session是open着得,这就是所谓的Open Session In view 。 我们可以filter来达到此目的。
代码:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try{
Session session =this.getSessionFactory().getCurrentSession(); //得到session对象
Transaction tran=(Transaction) session.beginTransaction();
chain.doFilter(request, response);
tran.commit();
}catch(Exception e){
e.printStackTrace();
}
}
解析:当请求到达时,首先被该过滤器过滤,开启事务,当数据被成功获取并在v上显示之后
又回到过滤器内部,提交事务,关闭session。
第三中方法: spring的osiv解决方案
OpenSessionInViewFilter [全名:org.springframework.orm.hibernate3.support.OpenSessionInViewFilter]是Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,直到这个请求结束,具体是通过一个Filter来实现的
请参考springopensessioninview
分享到:
相关推荐
深入浅出 Hibernate.pdf
深入浅出hibernate 清晰版
深入浅出Hibernate.pdf 深入浅出Hibernate.pdf
深入浅出Hibernate
《深入浅出Hibernate》读书笔记《深入浅出Hibernate》读书笔记《深入浅出Hibernate》读书笔记
夏昕的 深入浅出Hibernate>>是一本非常不错的解析Hibernate的书籍
本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...
Hibernate 的 lazyload 在FLEX中的解决方法例子 用的是gilead 因为LIB包太大上传很慢所以被我删掉了。
本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...
夏昕.深入浅出Hibernate经典教程。不容错过
深入浅出Hibernate 作者:夏昕 曹晓刚 7Z压缩:分包一大小18mb、分包二4mb 使用:把两个压缩包一起解压就可以了
菜单window -> preference -> Java -> Build Path -> User Librarys,分别建立名为Hibernate2,hibernate3,mysql-jdbc的用户库,分别包含对应的lib文件(如hibernate2包含hibernate-2.1目录下的hibernate2.jar及其lib...
深入浅出Hibernate完整版,除了资料外,还包括PPT和类型映射关系图
NULL 博文链接:https://ysj5125094.iteye.com/blog/1897557
高清版本适合新手入门查看《深入浅出Hibernate》.pdf,
第2部分 Hibernate 第2章 Hibernate概述 第3章 快速起步 3.1 准备工作 3.2 Hibernate配置 3.3 日志配置 3.4 第一段代码 3.5 代码初解 第4章 Hibernate基础 4.1 Hibernate基础语义 4.2 基础配置 4.3 ...
深入浅出hibernate,需要的下载。。
深入浅出 Hibernate 电子书 中文
加了标签的《深入浅出HIbernate》,方便阅读和查找。