`
sarin
  • 浏览: 1756132 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
E3b14d1f-4cc5-37dd-b820-b6af951740bc
Spring数据库访问系列...
浏览量:173587
C2083dc5-6474-39e2-993e-263652d27795
Android学习笔记
浏览量:368000
5f40a095-b33c-3e8e-8891-606fcf3b8d27
iBatis开发详解
浏览量:189176
B272a31d-e7bd-3eff-8cc4-c0624ee75fee
Objective-C学习...
浏览量:99765
社区版块
存档分类
最新评论

Hibernate单例实现(Struts1+Hibernate整合)

阅读更多
    大家都知道的一件事情,Hibernate启动时需要加载配置文件,连接数据库并映射对象,这一过程需要大量时间,每次运行测试文件时控制台的反馈已经可以看出来了,那么在整合开发时,必然不能每次数据操作都让Hibernate执行一次这个过程,需要在程序初始化时一并完成,完成这件事情需要单例模式的实现,这一过程是简单的。我们可以如下进行:
package demo;
import java.io.Serializable;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public final class HibernateUtil {
	private static SessionFactory sessionFactory;
	// 单例模式,只创建一次对象
	private HibernateUtil() {
	}
	// 初始化,开销很大,只做一次
	static {
		Configuration cfg = new Configuration();
		cfg.configure();// 不是hibernate.cfg.xml时将文件名传入
		sessionFactory = cfg.buildSessionFactory();
	}
	/**
	 * 相当于JDBC的注册驱动
	 */
	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
	/**
	 * 相当于JDBC的getConnection<BR>
	 * 注意:和HttpSession无关
	 */
	public static Session getSession() {
		return sessionFactory.openSession();
	}
	/**
	 * 保存对象
	 */
	public static void add(Object entity) {
		Session s = null;
		Transaction tx = null;
		try {
			s = HibernateUtil.getSession();
			tx = s.beginTransaction();
			s.save(entity);
			tx.commit();
		} finally {
			if (s != null) {
				s.close();
			}
		}
	}
	/**
	 * 更新对象
	 */
	public static void update(Object entity) {
		Session s = null;
		Transaction tx = null;
		try {
			s = HibernateUtil.getSession();
			tx = s.beginTransaction();
			s.update(entity);
			tx.commit();
		} finally {
			if (s != null) {
				s.close();
			}
		}
	}
	/**
	 * 删除对象
	 */
	public static void delete(Object entity) {
		Session s = null;
		Transaction tx = null;
		try {
			s = HibernateUtil.getSession();
			tx = s.beginTransaction();
			s.delete(entity);
			tx.commit();
		} finally {
			if (s != null) {
				s.close();
			}
		}
	}
	/**
	 * 获得对象
	 */
	public static Object get(Class clazz, Serializable id) {
		Session s = null;
		try {
			s = HibernateUtil.getSession();
			Object obj = s.get(clazz, id);
			return obj;
		} finally {
			if (s != null) {
				s.close();
			}
		}
	}
}

    单例模式实现的基本方法是:构造方法私有,这是为了只能是类本身来实例化自己,而不能让其他对象来二次调用;给外部一个方法来获取需要单例运行的那个对象;类内控制只运行一次单例对象的初始化。这样的三个限制就实现了单例模式,非常简单。
    本例中构造方法内没有做任何事情,初始化工作在static块中完成,static的执行是在构造方法调用之前完成的,从而保证读取配置,创建sessionFactory在程序运行期间只执行了一次,就是在程序加载时完成。后面的四个方法简单实现了CRUD操作,非常简单,这里不做过多说明。
    下面来介绍Struts1和Hibernate框架的简单整合。要把二者结合起来,必然有一种机制实现了二者之间的互认。Hibernate本身只是ORM框架,工作比较专一,而Struts是负责Web控制层的框架,自然要Struts来认识Hibernate。这里不绕弯子了,就是Struts的plug-in(插件)功能来实现的。
    在struts的配置文件中最后一项是<plug-in>,是Struts的插件选项,插件可以是和Struts整合的第三方类库提供的,也可以是用户自定义的。用户自定义时,插件类需要实现org.apache.struts.action.PlugIn接口,覆盖init()和destroy()两个生命周期方法。
package test.plugin;
import javax.servlet.ServletException;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;
public class HibernatePlugIn implements PlugIn {
	@Override
	public void destroy() {
		System.out.println("destroy method in hibernate plugin");
		SessionFactoryManager.closeSessionFactory();
	}
	@Override
	public void init(ActionServlet actionServlet, ModuleConfig config)
			throws ServletException {
		System.out.println("init method in hibernate plugin");
		SessionFactoryManager.openSessionFactory();
	}
}

    Hibernate单例实现类如下:
package test.plugin;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class SessionFactoryManager {
	private static Configuration configuration = null;
	private static SessionFactory sessionFactory = null;
	private SessionFactoryManager() {
	}
	static {
		configuration = new Configuration();
		configuration.configure();
		sessionFactory = configuration.buildSessionFactory();
	}
	public static SessionFactory openSessionFactory() {
		return sessionFactory;
	}
	public static Session getSession() {
		return sessionFactory.openSession();
	}
	public static void closeSessionFactory() {
		if (sessionFactory != null && sessionFactory.isClosed() == false) {
			sessionFactory.close();
		}
	}
}

    Struts配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
	… … …
	<plug-in className="test.plugin.HibernatePlugIn">
	</plug-in>
</struts-config>

    需要说明的是plug-in标签的配置是最后一个,Struts配置文件标签需要按顺序进行,否则可能出现前后依赖的错误。在程序启动时,我们可以在Tomcat控制台看到如下内容:

    这里我们看到了写在插件实现类中的输出语句,可以说明插件类执行后就开始初始化Hibernate了,这说明Struts已经知道Hibernate了。
写一个测试Action,就可以这样进行:
package test.action;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.hibernate.*;
import org.hibernate.criterion.Restrictions;
import test.bean.User;
import test.plugin.SessionFactoryManager;
public class HibernateTestAction extends Action {
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		PrintWriter out = response.getWriter();
		Session s = SessionFactoryManager.getSession();
		try {
			// 使用Criteria进行条件查询,参数是实体Bean
			Criteria c = s.createCriteria(User.class);
			//条件是name=?
			c.add(Restrictions.eq("name", "Sarin"));
			List<User> list = c.list();
			for (User user : list) {
				out.println(user.getId() + "<br>");
			}
		} finally {
			if (s != null) {
				s.close();
			}
		}
		return null;
	}
}

    测试实例中的表可以参照http://sarin.iteye.com/admin/blogs/593991中的结构进行设置,也可以应用于自定义的表结构中,id和name字段还是很普遍的。
    最后再说一点就是再整合Spring时就可以不用插件方式将Spring给注册进来,而是把Struts1交给Spring管理,为什么?Struts1的Action默认是单例的,会有线程安全问题,而交给Spring后,可以将单例Action多实例化,在一定程度上解决线程安全的问题,而且业务层交给Spring处理后,Spring容器对bean的管理和配置相对方便的多。
  • 大小: 106 KB
4
0
分享到:
评论

相关推荐

    轻量级Java EE企业应用实战——Struts 2+Spring+Hibernate整合开发电子书1

    《轻量级Java EE企业应用实战——Struts 2+Spring+Hibernate整合开发电子书1》是一本专注于Java EE企业级应用开发的书籍,主要涵盖了Struts 2、Spring和Hibernate这三个流行开源框架的整合应用。这本书对于Java...

    struts2+spring3+hibernate4

    在整合Struts2、Spring3和Hibernate4时,通常会利用Spring的AOP功能来实现事务管理,保证数据操作的一致性。Struts2的Action可以通过Spring的依赖注入获取到Spring管理的服务层对象,从而调用业务方法。此外,...

    SSH整合 struts+hibernate+spring

    ### SSH整合 struts+hibernate+spring #### 一、SSH整合概述 在软件开发领域,特别是Java Web开发中,Struts、Spring 和 Hibernate 被广泛地应用于构建复杂的应用程序。这三大框架各有所长,分别在不同的层面发挥...

    struts2+spring+hibernate整合策略

    ### Struts2+Spring+Hibernate整合策略 #### 一、企业应用开发的挑战与思考方式 企业级应用的开发面临着诸多挑战,其中包括但不限于业务逻辑的复杂性、系统的可扩展性、安全性和性能等方面的需求。为了应对这些...

    struts2+hibernate+spring整合

    Struts2、Hibernate和Spring是Java Web开发中的三大框架,它们各自负责不同的职责,并通过合理的整合,能够构建出高效、可维护的Web应用程序。本文将详细介绍这三个框架的整合过程及注意事项。 首先,我们来看...

    Struts2+Spring4+Hibernate4框架整合小项目,包含ssh源码及SQL文件(MySQL)

    在这个SSH整合项目中,开发者首先需要配置三个框架的环境,包括添加相应的库到项目的类路径,配置Struts2的struts.xml,Spring4的spring-context.xml以及Hibernate4的hibernate.cfg.xml。然后,创建实体类(Entity)...

    SSH整合开发完整例子(Struts+spring+hibernate完整开发)

    SSH整合是Java Web开发中的一个经典组合,由Struts、Spring和Hibernate三个开源框架组成,它们各自负责Web应用的不同层面,协同工作以提高开发效率和应用的可维护性。Struts处理请求和视图,Spring提供依赖注入和...

    Struts2+hibernate所需的包文件

    了解这些知识点后,结合提供的"Struts2+hibernate3包文件",开发者可以快速搭建一个整合Struts2和Hibernate的开发环境,开始构建基于这两者的企业级Web应用。在具体使用过程中,可能还需要根据实际需求调整配置、...

    Struts+Spring+Hibernate整合教程

    Struts、Spring和Hibernate是Java开发中非常经典的三大框架,它们各自解决了一部分软件开发中的问题...学习和掌握Struts+Spring+Hibernate整合教程,对于Java开发者来说,是提升专业技能、适应复杂项目需求的重要途径。

    maven3+struts2+spring+ibatis

    这个属于与Spring整合的问题,Spring容器在初始化对象的时候会根据bean的scope配置来考虑是重新建立一个对象,还是继续使用原来的对象,拿struts2的action的bean来说,如果scope这个参数没有配置,默认就是单例,即...

    struts2+hibernate所需jar包.rar

    在JavaSE11环境中,Struts2和Hibernate的整合需要以下jar包: 1. **Struts2核心库**:如struts2-core.jar,包含核心框架组件。 2. **Struts2插件**:如struts2-hibernate-plugin.jar,支持与Hibernate的集成。 3. *...

    Struts+Hibernate 整合开发.pdf

    ### Struts+Hibernate框架整合开发知识点详解 #### 一、Struts+Hibernate框架整合开发概述 **Struts+Hibernate框架整合开发**是一种常见的Java Web应用开发模式,它结合了Struts作为前端MVC(Model-View-...

    慕课网_使用Struts2+Hibernate开发学生信息管理系统201703151

    首先,我们来看Struts2和Hibernate的整合过程。整合这两者主要是为了方便地实现业务逻辑与数据访问的解耦。整合步骤包括:(1)配置用户类库,导入所需JAR包;(2)在`web.xml`中配置Struts2的过滤器;(3)创建`...

    Spring+Hibernate+Struts2整合

    **Spring+Hibernate+Struts2整合详解** Spring、Hibernate和Struts2是Java Web开发中的三大框架,它们各自负责不同的职责,共同构建了一个强大的企业级应用开发环境。Spring作为核心容器,管理对象的生命周期和依赖...

    spring+struts2+ibatis整合

    2. **配置Struts2**:在struts.xml中配置Action,设置结果类型,通常使用Spring插件实现Action的实例化,避免单例模式下的线程安全问题。 3. **配置iBatis**:配置SqlMapConfig.xml,定义数据源、事务管理器,编写...

    spring+springmvc+hibernate+thymeleaf 练习demo项目源码

    本项目"spring+springmvc+hibernate+thymeleaf 练习demo"是一个整合了这四个框架的实践示例,旨在帮助学习者理解它们如何协同工作。下面我们将深入探讨这些技术及其在项目中的应用。 1. Spring框架: - **依赖注入...

    spring+hibernate+struts架包

    Spring、Hibernate和Struts是Java开发中的三大主流框架,它们分别负责不同的职责,共同构建了企业级应用的基础架构。Spring作为一个全面的轻量级容器,提供了依赖注入(DI)和面向切面编程(AOP)的功能,使得代码...

    spring2+hibernate3+struts2JAR包

    1. **依赖注入**:Spring可以通过setter方法或构造函数对Struts2的Action和Hibernate的SessionFactory进行注入,避免硬编码和单例模式,使得组件之间松耦合。 2. **事务管理**:Spring提供了一流的事务管理服务,...

    spring,struts1.x ,hibernate整合

    Spring、Struts1.x 和 Hibernate 是经典的 Java Web 开发框架,它们的整合是构建企业级应用的常见方式。这三个框架分别负责不同的职责:Spring 提供依赖注入和事务管理,Struts1.x 负责视图和控制层,而 Hibernate ...

    maven3.0+struts+spring+hibernate

    这个属于与Spring整合的问题,Spring容器在初始化对象的时候会根据bean的scope配置来考虑是重新建立一个对象,还是继续使用原来的对象,拿struts2的action的bean来说,如果scope这个参数没有配置,默认就是单例,即...

Global site tag (gtag.js) - Google Analytics