`

HibernateTemplate 理解(对Callback继续理解)

阅读更多

    经常使用spring封装hibernate的同学,在写dao的具体实现类的时候,一般都会让dao实现类继承HibernateDaoSupport,

这样,在我们的dao实现类中就可以直接获得HibernateTemplate对象来直接使用,HibernateTemplate封装Hibernate的基本操作,

   通过HibernateTemplate源码可知,我们需要给hibernateTemplate一个sessionFactory;一般都是通过spring注入

   hibernateTemplate提供了一系列的CRUD方法,现在我们以get的实现来说明:

  

//我们实际调用的方法	
public <T> T get(Class<T> entityClass, Serializable id) throws DataAccessException {
		return get(entityClass, id, null);
	}
//真实实现
	public <T> T get(final Class<T> entityClass, final Serializable id, final LockMode lockMode)
			throws DataAccessException {

		return executeWithNativeSession(new HibernateCallback<T>() {
			@SuppressWarnings("unchecked")
			public T doInHibernate(Session session) throws HibernateException {
				if (lockMode != null) {
					return (T) session.get(entityClass, id, lockMode);
				}
				else {
					return (T) session.get(entityClass, id);
				}
			}
		});
	}

//被调用方法
	public <T> T executeWithNativeSession(HibernateCallback<T> action) {
		return doExecute(action, false, true);
	}

    get()方法的具体实现是doExecute()方法,在此使用的Callback,把相同的操作都封装到了doExecute()方法中,具体的实现就在get()方法中HibernateCallback中实现,通过上面的代码可以看出,我们的Callback方法doInHibernate需要一个参数session, 此参数是在doExecute方法中传入的(doExecute方法在下面描述),真正的获取值最终还是去操作session,这里就和Hibernate里操作一样,只不过此时的session的管理和事务的管理都在

doExecute()方法中来完成,我们不需要关心,我们只需要关心我们的Callback实现我们需要的逻辑。

 

  下面我们看一下delete方法的实现:

 

//我们调用的方法	
public void delete(Object entity) throws DataAccessException {
		delete(entity, null);
	}

//具体实现方法
	public void delete(final Object entity, final LockMode lockMode) throws DataAccessException {
		executeWithNativeSession(new HibernateCallback<Object>() {
			public Object doInHibernate(Session session) throws HibernateException {
				checkWriteOperationAllowed(session);
				if (lockMode != null) {
					session.lock(entity, lockMode);
				}
				session.delete(entity);
				return null;
			}
		});
	}

   看到吗?和get方法如出一辙,底层实现使用doExecute方法,具体实现放到自己的Callback里

 

   再看一下复杂操作时,我们会调用execute方法,execute方法的实现:

  

public <T> T execute(HibernateCallback<T> action) throws DataAccessException {
		return doExecute(action, false, false);
	}

   对,不会错了把,HibernateTemplate就是使用Callback模式把所有的方法的相同实现都放到了doExecute()方法中,具体实现放到CallBack中,Callback的抽象方法需要session,得到session后和hibernate的操作一抹一样。

 

  下面我们就来看看doExecute()方法的具体实现:

  

	protected <T> T doExecute(HibernateCallback<T> action, boolean enforceNewSession, boolean enforceNativeSession)
			throws DataAccessException {

		Assert.notNull(action, "Callback object must not be null");

		Session session = (enforceNewSession ?
				SessionFactoryUtils.getNewSession(getSessionFactory(), getEntityInterceptor()) : getSession());
		boolean existingTransaction = (!enforceNewSession &&
				(!isAllowCreate() || SessionFactoryUtils.isSessionTransactional(session, getSessionFactory())));
		if (existingTransaction) {
			logger.debug("Found thread-bound Session for HibernateTemplate");
		}

		FlushMode previousFlushMode = null;
		try {
			previousFlushMode = applyFlushMode(session, existingTransaction);
			enableFilters(session);
			Session sessionToExpose =
					(enforceNativeSession || isExposeNativeSession() ? session : createSessionProxy(session));
                        //此操作以前的代码都是在管理session,处理事务
			T result = action.doInHibernate(sessionToExpose);//此行调用了HibernateCallback的具体逻辑
			flushIfNecessary(session, existingTransaction);
			return result;
		}
		catch (HibernateException ex) {
			throw convertHibernateAccessException(ex);
		}
		catch (SQLException ex) {
			throw convertJdbcAccessException(ex);
		}
		catch (RuntimeException ex) {
			// Callback code threw application exception...
			throw ex;
		}
		finally {
			if (existingTransaction) {
				logger.debug("Not closing pre-bound Hibernate Session after HibernateTemplate");
				disableFilters(session);
				if (previousFlushMode != null) {
					session.setFlushMode(previousFlushMode);
				}
			}
			else {
				// Never use deferred close for an explicitly new Session.
				if (isAlwaysUseNewSession()) {
					SessionFactoryUtils.closeSession(session);
				}
				else {
					SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());
				}
			}
		}
	}

    代码逻辑很清晰,前半部分去获取session,管理事务,然后就是调用hibernateCallback中具体实现的逻辑,返回结果,然后做具体的事务和session管理,

 

   针对于hibernateTemplate提供的其他方法也是一样,使用callback模式,相同的操作都放到了doExecute中

 

   就这样hibernateTemplate屏蔽了hibernate的复杂操作,实现了封装

 

分享到:
评论

相关推荐

    hibernateTemplate的常用方法

    ### hibernateTemplate的常用方法详解 #### 概述 `HibernateTemplate`是Spring框架中用于操作Hibernate的一个便捷工具类,它极大地简化了Hibernate在实际应用中的集成与开发工作。通过`HibernateTemplate`,开发者...

    HibernateTemplate汇总

    在本文中,我们将对 HibernateTemplate 的主要方法进行总结和解释。 applyNamedParameterToQuery 方法 applyNamedParameterToQuery 方法用于将命名参数应用于 Query 对象。该方法接受两个参数:Query 对象和参数名...

    hibernateTemplate

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

    HibernateTemplate的用法总结

    本文将对HibernateTemplate的主要用法进行详细介绍。 #### 二、核心方法解析 在HibernateTemplate中,提供了多种常用的方法来实现数据访问操作(CRUD): 1. **`void delete(Object entity)`**:用于删除一个指定...

    HibernateTemplate的简单示例

    HibernateTemplate的简单示例

    HibernateTemplate源代码

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

    HibernateTemplate详细描述以及使用范围

    ### HibernateTemplate 的详细介绍与使用范围 #### 一、概述 在Spring框架中,`HibernateTemplate`作为ORM(Object Relational Mapping)技术中的一个重要组件,它提供了简化Hibernate操作的方法集,使得开发人员...

    HibernateTemplate 的常规用法.doc

    HibernateTemplate提供了丰富的API,可以实现对数据库的基本操作,包括创建(Create)、读取(Read)、更新(Update)和删除(Delete)等。以下是一些常用的方法: 1. `void delete(Object entity)`: 这个方法用于...

    关于使用HibernateTemplate

    `HibernateTemplate`是Spring框架对Hibernate的高级封装,它通过提供简洁易用的API,帮助开发者轻松实现对数据库的操作。更重要的是,它让开发者能够专注于业务逻辑的实现,而无需关心底层细节。通过使用`...

    对hibernate的封装 HibernateTemplate

    **标题:“对hibernate的封装 HibernateTemplate”** 在Java Web开发中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的交互。然而,直接使用Hibernate API进行数据库操作可能...

    HibernateTemplate的方法使用

    ### HibernateTemplate 的方法使用 #### 一、简介与配置方式 ...然而,正确地理解和使用这些方法对于保证应用程序的性能和可靠性至关重要。希望以上内容能帮助大家更好地掌握 HibernateTemplate 的使用技巧。

    hibernateTemplate常用方法.htm

    hibernateTemplate常用方法.htm

    hibernateTemplate批量删除数据

    本文将深入探讨如何利用Hibernate中的`HibernateTemplate`类进行批量数据删除操作,这不仅能够提高数据处理效率,还能优化数据库性能。 ### HibernateTemplate与批量删除 在Hibernate框架中,`HibernateTemplate`...

    HibernateTemplate分组统计

    ### HibernateTemplate 分组统计知识点详解 #### 一、概述 在Java Web开发中,尤其是在使用...这不仅有助于更好地理解和掌握Spring与Hibernate的集成方式,同时也为解决实际项目中的复杂数据处理问题提供了有效途径。

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

    在Spring框架中,整合Hibernate是常见的操作,Spring通过其强大的依赖注入(DI)特性,能够帮助我们更好地...通过理解和实践这个例子,你可以更好地掌握Spring的DI机制以及如何利用HibernateTemplate简化数据库操作。

    简单封装 HibernateTemplate 各项功能

    GenericHibernateDao 继承 HibernateDao,简单封装 HibernateTemplate 各项功能,简化基于Hibernate Dao 的编写。

    基于HIbernateTemplate的代码自动生成

    首先,我们需要理解`HibernateTemplate`。它是Spring对Hibernate提供的一个抽象层,它提供了一组模板方法,使得开发者可以更方便地进行持久化操作,如保存、更新、删除和查询等,而无需直接与`Session`或`...

    HibernateTemplate类的使用

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

    HibernateTemplate原理代码-模版设计模式

    Callback接口是模板设计模式在HibernateTemplate中的体现之一。它定义了执行Hibernate操作的标准形式,即`doInHibernate`方法,此方法接收一个`Session`参数。开发者可以通过实现这个接口来定义自己的数据库操作逻辑...

Global site tag (gtag.js) - Google Analytics