OpenSessionInview
Open Session In View模式的主要思想是:在用户的每一次请求过程始终保持一个Session对象打开着
实现步骤:
步骤一.创建一个Web项目,创建包cn.happy.util,创建HibernateUtil工具类
public class HibernateUtil{ private static final ThreadLocal sessionTL=new ThreadLocal(); private static Configuration cfg; private final static SessionFactory factory; static{ cfg=new Configuration().configure(); factory=cfg.buildSessionFactory(); } public static Session currentSession() { Session session=(Session)sessionTL.get(); if(session==null) { session=factory.openSession(); sessionTL.set(session); } return session; } public static void closeSession() { Session session=(Session) sessionTL.get(); sessionTL.set(null); session.close(); } }
步骤二.创建包cn.happy.entity,创建实体类Emp和Emp.hbm.xml小配置文件
public class Emp { private Integer empId; private String empName; public Integer getEmpId() { return empId; } public void setEmpId(Integer empId) { this.empId = empId; } public String getEmpName() { return empName; } public void setEmpName(String empName) { this.empName = empName; }
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.happy.entity"> <class name="Emp" table="Emps"> <id name="empId"> <generator class="native"> </generator> </id> <property name="empName"></property> <!-- 植入一个Dept对象 多对一 --> </class> </hibernate-mapping>
步骤三.创建包cn.happy.Dao创建类MyDao
public class MyDao{ public Object get(Class classz,Serializable id) { Object obj=HibernateUtil.currentSession().load(classz,id); return obj; } }
步骤四.创建包cn.happy.biz创建类MyBiz
public class MyBiz { public Object get(Class classz,Serializable id) { MyDao dao=new MyDao(); Obejct obj=dao.get(classz,id); return obj; } }
步骤五.创建cn.happy.filter包创建类MyFilter,实现Filter接口,重写doFilter方法
public void doFilter(ServletRequet request,ServletResponse response,FilterChain arg2) throw IOException,ServletExption{ Session session=null; Transaction tx=null; session=HibernateUtil.currentSession(); tx=session.beginTransaction(); arg2.doFilter(request,response); tx.commit(); HibernateUtil.closeSession(); }
步骤六.创建大配置文件hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings 数据库连接设置 --> <!-- 驱动类 --> <property name="connection.driver_class">oracle.jdbc.OracleDriver</property> <!-- url地址 --> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <property name="connection.username">Hibernate</property> <property name="connection.password">orcl</property> <!-- SQL dialect (SQL 方言) --> <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property> <!--在控制台打印后台的SQL语句 --> <property name="show_sql">true</property> <!-- 格式化显示SQL --> <!-- <property name="format_sql">true</property> --> <!-- 自动生成表 --> <property name="hbm2ddl.auto">update</property> <!-- 关联小配置 --> <mapping resource="cn/happy/entity/Emp.hbm.xml" /> </session-factory> </hibernate-configuration>
步骤七.在web.xml文件中配置fileter
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>openSessionInview</filter-name> <filter-class>cn.happy.Filter.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>openSessionInview</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
然后我们在index.xml文件中来显示数据
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@page import="org.hibernate.Session"%> <%@page import="cn.happy.Util.HibernateUtil" %> <%@page import="org.hibernate.Transaction" %> <%@page import="cn.happy.Biz.MyBiz" %> <%@page import="cn.happy.entity.Emp" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>OpenSessionInview</title> </head> <body> <% MyBiz biz=new MyBiz(); <!--拿到id为1的员工,在页面显示名字--> Object object = biz.get(Emp.class, 1); Emp emp=(Emp)object; %> <%=emp.getEmpName() %> </body> </html>
这样我们就实现了OpenSessionInview
OpenSessionInview的更多相关文章
- SpringMVC学习系列-后记 开启项目的OpenSessionInView
在系列的 SpringMVC学习系列(12) 完结篇 的示例项目中,由于当时考虑到OpenSessionInView会对性能有一定的影响,所以就没有配置项目的OpenSessionInView.在ma ...
- 细说OpenSessionInView问题
[环境参数] 环境:SSH框架 [问题描述] NoSession问题 HibernateTemplate对象提供的方法如果使用“延迟加载”,Session对象的管理不受开发者控制,此时如果在表现层获 ...
- SSH第一篇【整合SSH步骤、OpenSessionInView】
前言 到目前为止,Struts2.Hibernate.Spring框架都过了一遍了.也写过了Spring怎么与Struts2整合,Spring与Hibernate整合-本博文主要讲解SSH的整合 整合 ...
- [转]java框架spring中的opensessioninview有什么作用
在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时 session已关闭,所以就会出现异常. 比较典型的是在MV ...
- [转]OpenSessionInView模式
OpenSessionInView模式解决的问题: * hibernate事物边界问题 * 因session关闭导致hibernate延迟加载例外的问题 事物边界: 一个事物的完成应该 ...
- [转]Java程序员从笨鸟到菜鸟之(八十三)细谈Spring(十二)OpenSessionInView详解及用法
首先我们来看一下什么是OpenSessionInView? 在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而 ...
- 详细解析Spring事务的配置和OpenSessionInview的作用
1.事务的特性 原子性:事务中的操作是不可分割的一部分 一致性:要么同时成功,要么同时失败(事务执行前后数据保持一致) 隔离性:并发互不干扰 持久性:事务一旦被提交,它就是一条持久 ...
- (转)Spring提供的CharacterEncoding和OpenSessionInView功能
http://blog.csdn.net/yerenyuan_pku/article/details/52902282 前面我们以一种更加优雅的方式集成了Spring4.2.5+Hibernate4. ...
- openSessionInView的使用原理及性能分析
看到好多项目中用到了openSessionInView,这种做法无非是开发方便,能够在JSP页面中操作数据库层方面的业务. 下边说下openSessionInView的使用方法及性能问题. 使用: 1 ...
随机推荐
- myeclipse 2015 CI 16发布【附下载】
2015升级版再次来袭! 更新日志: Slack Integration 新版本集成了Slack,你只需要注册一个Slack帐号然后就可以发送和接收代码片段.你甚至不需要登录Slack就可以直接在Ec ...
- Servlet基础(三) Servlet的多线程同步问题
Servlet基础(三) Servlet的多线程同步问题 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率. 由于Servlet/JSP默认是以多线程模式执行的, ...
- 计算c字符的长度,保证不超过2^30
来自sqlite3源码 /* ** Compute a string length that is limited to what can be stored in ** lower 30 bits ...
- Android 短视频拍摄、拍照滤镜 第三方库SDK
视频 1.趣拍云服务 http://vcs.qupai.me/ 拍照 1.camera360 SDk 拍照滤镜 http://www.camera360.com/ 2 .凃图 http://tusdk ...
- nginx反向代理配置及优化
nginx反向代理配置及优化前言: 由于服务器apache抗不住目前的并发.加上前端squid配置后,问题依然无法解决.而页面程序大部分是动态.无法使用fastcgi来处理.因此想使用nginx做为反 ...
- 网络热恋之XML解析
XML 可扩展标记语言 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言 易读性高,编码手写难度小,数据量大 NSXMLPars ...
- iOS KVO概述
iOS KVO概述 面试中经常会被问到:什么是KVO?这个问题既然出现概率这么大,那么我们就来详细讲一讲到底什么是KVO.下次再有面试官问你的时候,你就可以娓娓道来,以彰显高逼格 概述 问:什么是KV ...
- Http协议与TCP协议简单理解
TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通 ...
- git之三
1.status命令与diff命令 前面我们已经成功地添加并提交了一个readme.txt文件,修改readme.txt如下: echo "Git is a distributed vers ...
- 定义返回Block的函数
鉴于Block与函数的相似性,先从返回函数指针的函数入手 返回函数指针的函数 int fun1(int arg){ return arg + 1;}int fun2(int arg){ return ...