`
virusfu
  • 浏览: 183862 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate中OpenSessionInView方式的实现

阅读更多

OpenSessionInView:由于Hibernate引入了Lazy Load特性,使得脱离HibernateSession周期的对象如果再想通过getter方法取到其关联对象的值,Hibernate会抛出一个LazyLoadException。所以为了解决这个问题,使得HibernateSession的生命周期变长。

步骤:

一、创建一个web Ojbect 项目

二、数据库为MySql

CREATE TABLE `user` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(50) NOT NULL,

  `birthday` datetime DEFAULT NULL,

  `sex` varchar(50) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=gb2312;

 

三、MyEclipse 中添加hibernate3x jar文件,或者通过MyEclipse的支持方式加入

 

四、更改hibernate.cfg.xml 文件配置 

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>
    <session-factory>
    	<property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</property>
    	<property name="hibernate.connection.url">jdbc:mysql:///test</property>
    	<property name="hibernate.connection.username">root</property>
    	<property name="hibernate.connection.password">root</property>
    	<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    	<property name="hibernate.show_sql" >true</property>
    	<property name="hibernate.format_sql" >true</property> 
    	<mapping resource="com/entity/User.hbm.xml" />
    </session-factory>	
</hibernate-configuration>

 

 

五、创建一个Hibernate获取session的工具类HibernateBase.java

  

package com.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public final class HibernateBase {
	private static SessionFactory sessionFactory;
	//创建一个线程本地变量 
	private static ThreadLocal threadLocal = new ThreadLocal();
	private HibernateBase(){}
	//本地线程添加session
	public static Session getThreadLocal(){
		Session session = (Session) threadLocal.get();
		if (session == null) {
			session = getSession();
			threadLocal.set(session);
		}
		return session;
	}
	public static SessionFactory getSessionFactory(){
		if (sessionFactory==null) {
			Configuration cf = new Configuration();
			cf.configure();
			sessionFactory = cf.buildSessionFactory();
		}
		return sessionFactory;
	}
	
	public static Session getSession(){
		return getSessionFactory().openSession();
	}
}

 

六、创建实体对象 

   

package com.entity;
import java.util.Date;
public class User {
	private Integer id;
	private String name;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	private Date birthday;
	private String sex;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
}

 

七、创建实体映射文件User.hbm.xml

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.entity.User" table="user">
       <!—二级缓存   <cache usage="read-only"/> -->
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native"></generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="50" not-null="true" />
        </property>
        <property name="birthday" type="java.util.Date">
        	<column name="birthday"></column>
        </property>
        <property name="sex" type="java.lang.String">
        	<column name="sex" length="50" not-null="true"></column>
        </property>
    </class>
</hibernate-mapping>

 

八、创建一个通用的dao文件,HiberanteDaoImpl.java

package com.dao.impl;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import com.util.HibernateBase;
public class HiberanteDaoImpl { 
	private static Session session;
	/**
	 * openSessionInView方式采用
	 * @param object
	 */
	public void addThread(Object object){
		try {
		    session =  (Session) HibernateBase.getThreadLocal();
			session.save(object);
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
	/**
	 * openSessionInView方式采用 删除
	 * @param object
	 */
	public void delThread(Object object){
		try {
		    session =  (Session) HibernateBase.getThreadLocal();
			session.delete(object);
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
}

 

 

 

九、创建过滤器:主要采用过滤的方式进行OpenSessionInView.java

 

package com.web;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.util.HibernateBase;

public class OpenSessionInView implements Filter {
@Override
	public void destroy() {
		// TODO Auto-generated method stub
	}
@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		Session session = null;
		Transaction tx = null;
		try {
			session = (Session) HibernateBase.getThreadLocal();
			tx = session.beginTransaction();//事物开始 在视图层创建事物
			arg2.doFilter(arg0, arg1);
			tx.commit();
			session.close();
		 
		} catch (HibernateException e) {
			if (tx!=null) {
				tx.rollback();
			}
		}finally{
			//不能关闭session 
		}
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
	}
}

  

十、 创建servlet文件UserServlet.java

 

  

package com.web;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dao.impl.HiberanteDaoImpl;
import com.entity.User;
public class UserServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		//添加user对象 然后再删除 这里就不做视图的创建了,通过servlet简单演示
		User user = new User();
		user.setName("abc");
		user.setBirthday(new Date());
		user.setSex("男");
		HiberanteDaoImpl dao  = new HiberanteDaoImpl();
		dao.addThread(user);  //添加
		dao.delThread(user); //删除	
		out.flush();
		out.close();
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}
}

 

十一、 打开浏览器输入http://localhost:8080/hibernate/userServlet

 

分享到:
评论
1 楼 fenglin_Java 2011-05-19  
为什么不能关闭session阿? finally那边,不是用完了 ,都要关掉的吗?

相关推荐

    Spring hibernate opensessioninview

    在Java Web开发中,Spring与Hibernate作为两个重要的框架,经常被一起使用来实现业务逻辑与数据持久化的处理。而在使用这两个框架时,为了更好地管理数据库会话(Session)生命周期,通常会采用`OpenSessionInView`...

    hibernate 中的lazy属性祥解.txt

    在Hibernate中,当设置关联属性的`fetch`或`lazy`属性为`true`时,表示该关联属性采用懒加载方式。这意味着,在获取主对象时,Hibernate不会立即加载与其关联的子对象。例如,在用户(User)与帖子(Post)之间的多...

    韩顺平spring 雇员管理系统hibernate jar包

    《韩顺平Spring雇员管理系统中的Hibernate ORM框架详解》 ...这个压缩包中的"hibernate jar包"是实现这些功能的关键,它包含Hibernate运行所需的类和库,是开发者在项目中使用Hibernate不可或缺的部分。

    SSH整合 struts+hibernate+spring

    在软件开发领域,特别是Java Web开发中,Struts、Spring 和 Hibernate 被广泛地应用于构建复杂的应用程序。这三大框架各有所长,分别在不同的层面发挥作用。为了更好地利用这些框架的优势,开发者通常会采用SSH...

    OpenSessionInView项目整合jar包

    在Java Web开发中,OpenSessionInView(OSIV)模式是一种常见的解决数据持久化问题的设计模式,主要用于Spring框架与Hibernate等ORM工具的集成。这个模式的主要目的是解决在HTTP请求处理过程中,由于Session范围内的...

    hibernate面试题总结

    Hibernate是Java领域中一款流行的持久...以上就是Hibernate面试中常见的问题和答案,涵盖了基本概念、缓存策略、查询方式以及事务和数据访问等方面的知识点。理解并掌握这些内容对于深入学习和使用Hibernate至关重要。

    Hibernate延迟加载以及利用Spring

    #### 二、Hibernate配置中的延迟加载实现 在Hibernate的配置文件或映射文件中,可以设置关联对象的加载策略为延迟加载。比如在给定的部分内容中,`...

    Struts+Spring+Hibernate开发实例.pdf

    - **OpenSessionInView** 是Hibernate的一个重要概念,它允许在视图层打开一个Session,这样就可以在渲染视图的时候访问数据库。 - **get() 和 set() 方法** 用于对象属性的获取和设置,在文档中被用于封装实体类...

    Struts+spring+hibernate面试资料

    Hibernate通过以下方式实现延迟加载: - **使用懒加载代理**:对于一对多或多对多的关系,Hibernate会在需要的时候动态创建代理对象。 - **OpenSessionInView模式**:这是一种解决懒加载异常的有效方案,通过确保...

    spring管理struts和hibernate

    Spring框架则提供了强大的依赖注入(DI)功能,通过它可以有效地管理对象的生命周期,以及实现对应用中各种组件的解耦。 为了更好地实现Struts与Spring的整合,我们可以采用以下步骤: 1. **配置Spring管理Struts*...

    Hibernate学习笔记

    关联映射是Hibernate中的高级主题,包括多对一、一对多、一对一和多对多的映射方式。在一对多的关联映射中,一个父对象可以包含多个子对象,子对象通过外键指向父对象。一对一映射可以通过在主键上使用unique属性...

    spring+spingmvc+hibernate整合总结

    在Java Web开发中,Spring、SpringMVC和Hibernate是三个非常重要的框架,它们分别负责依赖注入、Web请求处理和对象关系映射。将这三个框架整合在一起,可以构建出高效、灵活且易于维护的Web应用程序。下面将详细解析...

    HibernateSpring多数据库解决方案.doc

    本方案主要探讨如何在基于Hibernate和Spring框架的环境中实现多数据库的管理,特别是在`OpenSessionInView`模式下的配置。 首先,我们看到在`applicationContext.xml`配置文件中定义了两个数据源,一个用于读操作...

    struts spring hibernate面试题

    - **集成方法**:在 Spring 中,可以通过 `SessionFactory` 和 `HibernateTemplate` 或 `JpaTemplate` 简化 Hibernate 的使用。`SessionFactory` 提供了创建 Session 的工厂,而 `HibernateTemplate` 或 `...

    struts+hibernate,spring面试题

    Struts、Hibernate和Spring(SSH)是Java Web开发中经典的三大框架,它们分别负责MVC模式中的模型(Model)、视图(View)和控制器(Controller)部分。在面试中,了解这些框架的核心概念和实际应用是非常重要的。 ...

    SSH项目整合示例【OpenSessionInView】所用到的jar包

    OpenSessionInView(OSIV)模式是SSH整合中常见的一种优化策略,它在用户的一次HTTP请求过程中保持Hibernate Session,避免了多次打开和关闭Session,减少了N+1查询问题,提高了性能。 **Spring** 是一个全面的企业...

    Open_Session_In_View详解.doc

    ### Open_Session_In_View详解 #### 一、背景与概念 在使用Hibernate进行对象持久化时,经常遇到的一个问题是关于懒...通过合理配置和使用,可以大大简化Hibernate应用中的数据访问逻辑,提高开发效率和系统性能。

    struts2+hibernate+spring

    根据提供的文件信息,...综上所述,通过将Struts2、Hibernate和Spring框架进行整合,不仅可以充分利用每个框架的特点,还可以实现更高效、更灵活的Web应用开发。希望以上内容能帮助您更好地理解这些框架及其整合方式。

    收集的struts+spring+hibernate面试题.doc

    在 Spring 中,AOP 可以通过声明式的方式实现,即通过 XML 或注解配置来定义切点(Pointcut)、增强(Advice)等。 **IOC(Inversion of Control,控制反转)**: 是一种设计模式,用来降低代码之间的耦合度。在 ...

Global site tag (gtag.js) - Google Analytics