粗谈Spring与Hibernate的整合——从实现的功能上看Spring与Hibernate的整合

原创 2007年09月28日 23:44:00

1.管理SessionFactory

   使用Spring整合Hibernate时我们不需要hibernate.cfg.xml文件。首先,在applicationContext.xml中配置数据源(dataSource)bean和session工厂(sessionFactory)bean。其中,在配置session工厂bean时,应该注入三个方面的信息:

      ●数据源bean

      ●所有持久化类的配置文件

      ●Hibernate的SessionFactory的属性

Hibernate的SessionFactory的属性信息又包括两个内容,一,Hibernate的连接方法;二,不同数据库连接,启动时的选择。

2.为HibernateTemplate注入SessionFactory对象,通过HibernateTemplate来持久化对象

   Spring提供了HibernateTemplate,用于持久层访问,该模板无需打开Session及关闭Session。它只要获得SessionFactory的引用,将可以只能地打开Session,并在持久化访问结束后关闭Session,程序开发只需完成持久层逻辑,通用的操作(如对数据库中数据的增,删,改,查)则有HibernateTemplate完成。

   HibernateTemplate有三个构造函数,不论是用哪一种构造,要使HibernateTemplate能完成持久化操作,都必须向其传入一个SessionFactory的引用。

   HibernateTemplate的用法有两种,一种是常规的用法,另一种是复杂的用。

      一,常规的用法

         HibernateTemplate通过它自己的delete(Object entity) ,find(String queryString),save(Object entity)等等常用的方法即可完成大多数DAO对象的增,删,改,查等操作。

      二,复杂的用法

         HibernateTemplate的复杂的用法是通过如下的两个方法来完成的:

            ●Object execute(HibernateCallback action)

            ●List execute(HibernateCallback action)

         这两个方法都需要一个HibernateCallback实例,程序开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决了Spring封装Hibernate后灵活不足的缺陷。HibernateCallback是一个接口,该接口只有一个方法doInHibernate(org.hibernate.Session session),该方法只有一个参数Session。

         通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,方法doInHibernate就是Spring执行的持久化操作。具体的代码实例如下:

         public class PersonDaoImpl {

                 private SessionFactory sessionFactory;

                 public void setSessionFactory(SessionFactory sessionFactory) {

                         this.sessionFactory = sessionFactory;

                 }

                 public List findPersonByName(final String name) {

                         HibernateTemplate hibernateTemplate =

                                            new HibernateTemplate(this.sessionFactory);

                         return (List)hibernateTemplate.execute(

                                   public Object doInHibernate(Session session)  throws Hibernate Exception {

                                           List result =session.createCriteria(Person.clsss)

                                                                         .add(Restrictions.like("name",name+"%")).list();

                                           return result;

                                   }

                         );

                 }

        }

       注:在方法doInHibernate内可以访问Session,该Session对象是绑定到该线程的Session实例,该方法内的持久层操作与不使用Spring时的持久层操作完全相同,这保证了对于复杂的持久层访问时,依然可以使用Hibernate的访问方式。

3.DAO的实现

   DAO的实现有两种方式:一,继承HibernateDaoSupport实现DAO;二,基于Hibernate3.0实现DAO。

      一,继承HibernateDaoSupport实现DAO

         Spring为Hibernate的DAO提供了工具类HibernateDaoSupport。该类主要提供了如下两个方法来方便DAO的实现:

         ●public final HibernateTemplate getHibernateTemplate()

         ●public final void setSessionFactory(SessionFactory sessionFactory)

         其中,setSessionFactory方法用来接收Spring的ApplicationContext依赖注入的SessionFactory实例;getHibernateTemplate方法则用来根据刚才的SessionFactory产生Session,最后由HibernateTemplate来完成数据库访问。

      二,基于Hibernate3.0实现DAO

        在Hibernate处于事务的管理下时(通常Spring为Hibernate提供事务管理),通过SessionFactory的getCurrentSession()方法可以返回当前的Session,如果当前的JTA事务关联的Session不存在,则系统打开一次新的Session,并关联到当前的JTA事务;如果当前JTA事务关联的Session已经存在,则直接返回该Session。获得了当前的Session后就可以进行持久化操作了。

      可见,不论使用上面的哪一种方式实现DAO都需要用Spring来注入SessionFactory实例。

4.事务的管理

   Hibernate建议所有的对数据库的访问都应放在事务内进行,即使进行的只是读操作。Spring同时支持编程式事务和声明式事务。通常推荐使用声明式事务。

   编程式事务管理:

   编程式事务提供了TransactionTemplate模板类,用的时候必须向其体提供一个PlatformTransactionManager实例。只要TransactionTemplate获取了PlatformTransactionManager的引用,TransactionTemplate就可以完成事务操作了。TransactionTemplate提供了一个execute方法,它接收一个TransactionCallback实例。TransactionCallback包含如下方法:

      ●Object doInTransaction(TransactionStatus status)

这是需要有返回值的情况。如果不需要有返回值的话,我们可以用TransactionCallbackWithOutResult类来代替TransactionCallback类,它也有一个方法:

      ●void doInTransaction(TransactionStatus status)

   在这个两个方法中,在出现异常时,TransactionStatus的实例status可以调用setRollbackOnly()方法进行回滚。

   一般情况下,向execute方法传入TransactionCallback或TransactionCallbackWithOutResult实例时,采用的是匿名内部类的形式。

   声明式事务管理:

   声明式事务管理的配置方式通常有三种:

      ●使用TransactionProxyFactoryBean为目标bean生成事务代理的配置。

      ●使用BeanNameAutoProxyCreator,根据bean name自动生成事务代理的方式,这是直接利用Spring的AOP框架配置事务代理的方式,需要对Spring的AOP框架有所了解。

      ●使用DefaultAdvisorAutoProxyCreator,这也是直接利用Spring的AOP框架配置事务代理的方式,只是这种配置方式的可读性不如使用BeanNameAutoProxyCreator的配置方式。
 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java/Android中的函数调用&回调函数&自定义回调函数

在Android的学习过程中经常会听到或者见到“回调”这个词,那么什么是回调呢?所谓的回调函数就是:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体的实现,需...

Android 对图片的缩放,拖地,跟系统图库的效果一样

之前做项目要对图片的查看,然后就自己写了一个,适合对图片的浏览,跟系统图库的效果一样哦,先贴一张美女图片,听说有美女,男人就会多看一眼,不知道是不是真的,哈哈 布局文件需要注意的一点是 scaleTy...

Android 回调接口是啥,回调机制详解

首先解决啥是回调: 举个例子:某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。...

一个经典例子让你彻彻底底理解java回调机制

以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中...

我的2014年总结 - 一些失败的面试经历

2014年已经离我们远去了,2015年第一天早上起床就看到上海外滩的踩踏事件,30多个生命永远的停留在了2014,感到非常的震惊,有时候觉得生命是如此的脆弱,愿死者安息,生者坚强,借着元旦放假时间坐在...

2013年度【博客之星评选活动】正在进行中,希望大家支持下,十分感谢!

最近CSDN举办了2013年度的博客之星的一个评选活动,我也很荣幸成为这个评选活动的候选人之一,感谢CSDN给我这个机会,看到很多候选人都写了拉票博客,我也决定写篇拉票的博客来帮自己拉上的一票,希望看...

Android 开源框架Universal-Image-Loader完全解析(三)---源代码解读

本篇文章主要是带大家从源码的角度上面去解读这个强大的图片加载框架,自己很久没有写文章了,感觉生疏了许多,距离上一篇文章三个月多了,确实是自己平常忙,换了工作很多东西都要去看去理解,然后加上自己也懒了,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)