`
bloodwolf_china
  • 浏览: 131638 次
社区版块
存档分类
最新评论

HibernateTemplate使用之手工管理Session和Transaction

阅读更多
大多数人在第一次使用HibernateTemplate时都很好奇,不需要自己关闭Hibernate Session。如果在需要使用事务的情况一般使用spring配置TransactionProxyFactoryBean用AOP方式实现,还有就是使用HibernateTemplate的execute(HibernateCallback action)方法,构造一个匿名类实现HibernateCallback接口的Object doInHibernate(Session session)方法。使用前一种方法需要使用spring IOC,后一种代码因为使用匿名类,如果有较多逻辑代码显得难看、不清晰。是否还有其他使用HibernateTemplate的简单方法呢。
查看HibernateTemplate源码发现,如果不存在事务,每次执行HibernateTemplate方法都会取得新Session,执行完数据库操作后再关闭Session。虽说不是每次都是真正开关数据库连接,但总感觉这样做不好。我们需要即使多次执行HibernateTemplate中方法是用的同一个Session,这样既不浪费资源,也可以自己手工管理事务。现在就来写一个工具类模拟OpenSessionInView模式和HibernateTransactionManager功能
import org.hibernate.FlushMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.orm.hibernate3.SessionHolder;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.util.Assert;

public class HibernateSessionUtils{

	private static final ThreadLocal sessionFactoryLocal = new ThreadLocal();

	public static void getSession(SessionFactory sessionFactory){
		getSession(sessionFactory,null);
	}

	public static void getSession(SessionFactory sessionFactory,FlushMode flushMode){
		if (TransactionSynchronizationManager.hasResource(sessionFactory))return;
		Session session = SessionFactoryUtils.getSession(sessionFactory, true);
		if (flushMode != null) {
			session.setFlushMode(flushMode);
		}
		TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
		sessionFactoryLocal.set(sessionFactory);
	}

	public static void beginTransaction(){
		SessionFactory sessionFactory = (SessionFactory) sessionFactoryLocal.get();
		Assert.state(sessionFactory != null,"No existing sessionFactory found for thread");
		SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.getResource(sessionFactory);
		Assert.state(sessionHolder != null,"No existing session found for transaction");
		Transaction transaction = sessionHolder.getTransaction();
		Assert.state(transaction == null,"transaction already found for transaction");
		transaction = sessionHolder.getSession().beginTransaction();
		transaction.begin();
		sessionHolder.setTransaction(transaction);
	}
	
	public static void commit(){
		commit(true);
	}
	public static void commit(boolean autoClose){
		SessionFactory sessionFactory = (SessionFactory) sessionFactoryLocal.get();
		Assert.state(sessionFactory != null,"No existing sessionFactory found for thread");
	    SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.getResource(sessionFactory);
		Assert.state(sessionHolder != null,"No existing session found for transaction");
		Transaction transaction = sessionHolder.getTransaction();
		Assert.state(transaction != null,"No transaction found for transaction");
		transaction.commit();
		sessionHolder.setTransaction(null);
		if(autoClose)
			closeSession();
	}

	public static void rollback(){
		SessionFactory sessionFactory = (SessionFactory) sessionFactoryLocal.get();
		Assert.state(sessionFactory != null,"No existing sessionFactory found for thread");
		SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.getResource(sessionFactory);
		Assert.state(sessionHolder != null,"No existing session found for transaction");
		Transaction transaction = sessionHolder.getTransaction();
		Assert.state(transaction != null,"No transaction found for transaction");
		transaction.rollback();
		sessionHolder.setTransaction(null);
	}

	public static void closeSession(){
		SessionFactory sessionFactory = (SessionFactory) sessionFactoryLocal.get();
		if(sessionFactory == null)return;
		SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
		if(sessionHolder != null){
			Transaction transaction = sessionHolder.getTransaction();
			Assert.state(transaction == null,"Transaction found for session");
		}
		SessionFactoryUtils.closeSession(sessionHolder.getSession());
		sessionFactoryLocal.set(null);
	}

}



使用示例
public static void main(String[] args) {
		SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
		HibernateTemplate template = new HibernateTemplate(sessionFactory);
		HibernateSessionUtils.getSession(sessionFactory);
		//do any thing
		template.find("....");
		HibernateSessionUtils.beginTransaction();
		template.save(null);
		HibernateSessionUtils.commit();
		HibernateSessionUtils.closeSession();
	}

编写测试代码或少量代码可以采用这种方式,如果是真正应用的话还是使用Spring IOC和AOP比较好,不推荐这种手工方式
分享到:
评论
2 楼 left405 2009-02-20  
好东西, 收藏了.
1 楼 taupo 2008-06-05  
我们需要即使多次执行HibernateTemplate中方法是用的同一个Session,这样既不浪费资源,也可以自己手工管理事务

这个想法我觉得很好,但是一般都有事务的存在,所以我觉得楼主的这个实用性不高,呵呵

相关推荐

    关于使用HibernateTemplate

    2. **Session管理**:传统的Hibernate使用方式通常需要显式地获取和关闭`Session`对象。而在使用`HibernateTemplate`时,这些操作都被自动管理,从而避免了因遗漏关闭`Session`而导致的资源泄露问题。 3. **异常处理...

    HibernateTemplate类的使用

    然而,在实际应用中,如果开发者希望对事务进行更细粒度的控制,可以考虑使用`@Transactional`注解或者显式地使用`Session`的`beginTransaction`和`commit`/`rollback`方法来进行事务管理。需要注意的是,直接在`...

    HibernateTemplate详细描述以及使用范围

    通过使用`HibernateTemplate`,可以减少大量重复性的代码编写工作,同时提高代码的可维护性和可读性。 #### 二、HibernateTemplate的使用场景 1. **基础数据访问操作**:如查询、插入、更新、删除等常见数据库操作...

    HibernateTemplate 的常规用法.doc

    它为简化Hibernate在Spring框架中的使用提供了便利,减少了手动管理Session和事务的复杂性,提升了开发效率。本节将深入探讨HibernateTemplate的常规用法。 HibernateTemplate提供了丰富的API,可以实现对数据库的...

    HibernateTemplate汇总

    HibernateTemplate 汇总 ...HibernateTemplate 提供了许多实用的方法来简化 Hibernate 的使用,提高了数据库操作的效率和简洁性。本文对 HibernateTemplate 的主要方法进行了总结和解释,希望对读者有所帮助。

    HibernateTemplate的用法总结

    HibernateTemplate是Spring框架提供的一种操作Hibernate的方式,它简化了Hibernate的使用过程,使开发者无需关注Session的管理与事务控制,极大地提高了开发效率。本文将对HibernateTemplate的主要用法进行详细介绍...

    HibernateTemplate的方法使用

    ### HibernateTemplate 的方法使用 #### 一、简介与配置方式 **HibernateTemplate** 是 Spring 框架中用于简化 Hibernate 使用的一个工具类。它通过 AOP(面向切面编程)的思想,封装了大量的 CRUD(创建、读取、...

    hibernateTemplate的常用方法

    通过`HibernateTemplate`,开发者可以非常方便地进行数据的增删改查等基本操作,而无需关心Hibernate Session的开启、关闭及事务管理等问题。本文将详细介绍`HibernateTemplate`的一些常用方法及其应用场景。 #### ...

    对hibernate的封装 HibernateTemplate

    1. **事务管理**:HibernateTemplate自动管理Hibernate Session和Transaction,确保在事务边界内的操作原子性和一致性。无需手动开启和关闭Session,也不用关心事务的回滚和提交。 2. **异常转换**:它将Hibernate...

    HibernateTemplate源代码

    ### HibernateTemplate源代码解析 #### 一、简介 `HibernateTemplate`是Spring框架中的一个类,位于`org.spring...通过对`HibernateTemplate`的学习和使用,可以大大提高基于Hibernate的数据访问层的开发效率和质量。

    HibernateTemplate分组统计

    1. **HibernateTemplate**:是Spring框架提供的用于简化Hibernate使用的模板类。它提供了大量操作数据库的方法,包括查询、更新等,并且内置了事务管理机制。 2. **分组统计**:指通过SQL语句对查询结果按照一个或多...

    hibernateTemplate

    ### HibernateTemplate概述与核心功能详解 #### 一、引言 在Java开发领域,特别是企业级应用开发中,数据持久层的设计与实现至关重要。...希望本文能帮助读者更好地理解和掌握`HibernateTemplate`的使用技巧。

    Spring与Hibernate集成中的session

    本文将详细探讨Spring与Hibernate的集成,特别是如何在集成环境中使用和管理`Session`。 首先,Spring作为一个轻量级的框架,提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,它可以帮助我们解耦应用程序...

    hibernateTemplate批量删除数据

    在Hibernate框架中,`HibernateTemplate`提供了一种更为简洁、易于使用的API,用于执行基本的CRUD(创建、读取、更新、删除)操作。对于批量删除数据,`HibernateTemplate`提供了`bulkUpdate()`方法,该方法通过执行...

    JAVA的hibernate手动获取session的方法

    在实际开发中,为了更好地管理Session和事务,我们通常会使用DAO(数据访问对象)模式,或者Spring的HibernateTemplate或JPA的EntityManager。这些高级工具可以自动化处理事务管理和Session生命周期,减少出错的可能...

    hibernate session生命周期示例

    在实际应用中,通常推荐使用Transaction模板或者Spring的HibernateTemplate或JpaTemplate,它们可以帮助你更好地管理Session和事务。例如,Spring的`@Transactional`注解可以自动管理事务的生命周期,使得代码更加...

    一个模拟Spring将SessionFactory注入到HibernateTemplate的小例子

    本示例将深入探讨如何使用Spring将SessionFactory注入到HibernateTemplate中,从而实现数据库操作的便捷管理。 首先,让我们了解几个关键组件: 1. SessionFactory:这是Hibernate的核心工厂类,用于创建Session...

    HibernateTemplate的简单示例

    HibernateTemplate的简单示例

    HibernateTemplate及generator用法.doc

    而`HibernateTemplate`则可以更好地控制和管理Session,避免这个问题。 以下是`getSession`的一些常用操作: - 查询:`getSession().find()`, `getSession().createQuery()` - 保存:`getSession().save()`, `...

Global site tag (gtag.js) - Google Analytics