Spring+Hibernate结合总结

过去一星期主要把精力放在了数据库HibernateSpring的结合上,所以也搜集和总结了一些有用的资料,整理如下。

自己最大的感受是SpringHibernate提供了非常好的支持,包括Session管理、声明式事务管理、代码模板。用Spring包装Hibernate,使用起来非常方便,代码量大大减少,以往每个DAO方法中的重复代码不需要写了,而且因为使用了Spring,直接面向接口编程,整个架构有了层次上的提升。总之一个字,爽!

要把SpringHibernate并不难,无非是配置好几个bean。难的是必须把整个架构组织好,不能乱来。首先,要面向接口编程(即使不用Spring,面向接口编程也是非常重要的,是一个程序员能力高低的分水岭),其次,要组织好DAOService对象间的关系。最后,要对Spring是如何管理HibernateSession和事务有清醒的认识。

 

 简单总结一下都需要配置哪些Bean(在applicationContext-hibernate.xml里):

  

1、配置一个dataSource,是给sessionFactory用的。一般人用commons-dbcp,我认为这个连接池不好,Hibernate都不提供内建支持。我用的是c3p0com.mchange.v2.c3p0.ComboPooledDataSource)。这个连接池也是基于JavaBean的命名规范设置参数的,所有配置起来也狠容易。

  

2、配置一个hibernate Propertiesorg.springframework.beans.factory.config.PropertiesFactoryBean),也是给sessionFactory用的。配置它是为了方便,可以把所有要给Hibernate的设置统一放在一起。

  

3、配置sessionFactoryorg.springframework.orm.hibernate3.LocalSessionFactoryBean)。在属性dataSourceref,在属性hibernateProperties中也ref,这样,sessionFactory就知道到哪去取连接、怎么设置Hibernate了。然后在属性mappingResources中配一个list,把所有的.hbm.xml也进去。

  

4、配置transactionManagerorg.springframework.orm.hibernate3.HibernateTransactionManager),这是将来给所有的service方法做声明式事务管理用的。只要把属性sessionFactoryref上就可以了。

 

5、为了简化将来service方法的配置,对遵循某些规则命名的service方法自动设置上对应的事务管理,再配一baseTxProxyorg.springframework.transaction.interceptor.TransactionProxyFactoryBean),让它lazy-init=true, abstract=true。把属性transactionManagerref上,然后配置属性transactionAttributes  

 

最后,

 我使用OpenSessionInView模式管理session,在web.xml中加入org.springframework.orm.hibernate3.support.OpenSessionInViewFilter这个filter,设置好filter-mappingsession就会自动打开和关闭了。

 这样,SpringHibernate结合的配置就做好了。接下来就是怎么用的问题了。
    
 

这里面涉及不少技巧,而且没有统一的方法。我的做法是这样的:
    
 

DAO接口正常写,DAO的实现类实现接口,同时extends HibernateDaoSupport。在某些简单方法中,如save/saveOrUpdate/update/delete,直接调用getHibernateTemplate()中的相应方法实现。稍微复杂一些的方法,使用
   

   getHibernateTemplate().execute(

    new HibernateCallback() {

       public Object doInHibernate(Session session) throws HibernateException {

         //return list;

       }

     });

 

 来实现。这样,代码量大大减少。我看到JavaEye上大家讨论的时候,有些人不喜欢内部匿名类这种方式。不过我觉得还可以,跟以前直接调用Hibernate API、还要写事务开启、事务提交、事务回滚这一堆重复代码相比,已经狠不错了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值