[转] getHibernateTemplate()和getSession()的区别

转http://jeoff.blog.51cto.com/186264/133434

自动生成hibernate配置文件的时候,会在dao层用到getSession()方法来操作数据库记

录,但是他还有个方法getHibernateTemplate(),这两个方法究竟有什么区别呢?

1.使用getSession()方法你只要继承sessionFactory,而使用getHibernateTemplate

()方法必须继承 HibernateDaoSupport当然包括sessionFactory,这点区别都不是特别

重要的,下面这些区别就很重要了

2.getSession()方法是没有经过spring包装的,spring会把最原始的session给你,在

使用完之后必须自己调用相应的 close方法,而且也不会对声明式事务进行相应的管理,一

旦没有及时关闭连接,就会导致数据库连接池的连接数溢出,getHibernateTemplate()方

法是经过spring封装的,例如添加相应的声明式事务管理,由spring管理相应的连接。

在实际的使用过程中发现的确getHibernateTemplate()比getSession()方法要好很多,

但是有些方法在getHibernateTemplate()并没有提供,这时我们用

HibernateCallback 回调的方法管理数据库.

例如如下代码:
/**
     * 使用 hql 语句进行操作
     * @param hql HSQL 查询语句(使用回调函数访问外部变量,必须是final的)
     * @param offset 开始取数据的下标
    * @param length 读取数据记录数
    * @return List 结果集
*/
public List getListForPage ( final String hql , final int offset , final int length ) {
              List list = getHibernateTemplate().executeFind ( new HibernateCallback ( ) {
                            public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
                                            Query query = session.createQuery ( hql ) ;
                                            query.setFirstResult ( offset ) ;
                                            query.setMaxResults ( length ) ;
                                            List list = query.list ( ) ;
                                            return list ;
                           }
               }) ;
               return list ;
}


================================================================

HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。HibernateTemplate的灵活访问方式是通过如下两个方法完成:

qObject execute(HibernateCallback action)

qList execute(HibernateCallback action)

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

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

================================================================

到底DAO层中用哪个方式好呢



在Spring2.5 api doc中
 

“In general, it is recommended to use HibernateTemplate, either with the provided convenience operations or with a custom HibernateCallback that provides you with a Session to work on. HibernateTemplate will care for all resource management and for proper exception conversion.”

 /code]

推荐使用使用“HibernateTemplate”。

================================================================

getSession() 获得的是原始的sessionFactory,每次你必须自己维护session如结束后你必须关闭session。如果是hibernate中进行数据库操作,你获得是原始的hibernate style和excepttion。 

而hibernate template是spring包装过的,它会帮你管理session,并且它会将hibernate exceptions转换成其他的分类后的错误。这点getSession是肯定不行了。例如你用orcle和mysql返回的错误在getSession中就是不一样的,而在hibernate template中就是一样的。 

但我在实际使用中发现,对于基本的操作Hibernate template处理的的确比getSession要好,但到了复杂查询的时候如分页时需要调用getHibernateTemplate().execute(HibernateCallBack).要产生很多innerClass,调试非常不便。而getSession就相当简单多了。


  

猜你喜欢

转载自zhb0917.iteye.com/blog/1730647