gethibernate getsessionTemplate和getSession的区别

getHibernateTemplate用法 - 陈旭猴 - 博客园
前提条件:你的类必须继承HibernateDaoSupport&一:&回调函数:&
Java代码&&
public&List&getList(){&&
&&&&&&&&return&(List&)&getHibernateTemplate().execute(&&
&&&&&&&&&&&&&&&&new&HibernateCallback()&{&&
&&&&&&&&&&&&&&&&&&&&public&List&doInHibernate(final&Session&s)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&throws&HibernateException,&SQLException&{&&
StringBuffer&sb&=&new&StringBuffer();&&
Query&query&=&s.createSQLQuery(sb.toString());
Query&query&=&s.createQuery(sb.toString());
List&list&=&query.list();&&
return&list&;&&
&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&});&&&&&&&&&&&
采用这种做法的好处是:不用关心事务。session的创建和销毁,一切都在程序内部完成。看看名字doInHibernate就知道好处了。不好的是程序看起来比较乱!个人认为。&二:&
Java代码&&
getHibernateTemplate().find():&&
ist&list&=&getHibernateTemplate().find(String&sql&):&&
这种的前提是sql必须是hql ,原始sql 不能执行。&三:&自己获取session处理。&获取session的两种方式:this.getSession();和this.getHibernateTemplate().getSessionFactory().openSession();&获取session以后再createQuery操作就一样了。但是这种做法,是需要自己去手动关闭session的。所以你需要配置openSessioninview,个人认为不推荐使用!&其他:&getHibernateTemplate.delete(Object);&getHibernateTemplate.save(Object);&getHibernateTemplate.update(Object);&总结:推荐使用回调函数。&
补充百科:
的Hibernate ORM&带来了方便的HibernateDaoSupport类,你的类可以继承它:
public class StudentDaoHibernate extends HibernateDaoSupport implements StudentDao{
.................
如果你选择这种设计,就需要动态注入而HibernateDaoSupport包含这个属性.这个类提供了一个方便的方法getHibernateTemplate(); 就能得到的一个实例.它也有getSession()和releaseSession,以便于你应为某些原因而不使用HibernateTempate的情况下执行操作。
HibernateDaoSupport提供了基于的自动处理,完全可以不用理会事务的开始与提交。在中一个使用一个事务,那么在Hibernate中一个事务肯定要关联一个了,然而这个SessionFactory却没有在中体现。其实主要的原因是HibernateDaoSupport类已经默默地做了封装的工作,它用一个setSessionFactory方法将SessionFactory进行注入,所以继承自HibernateDaoSupport类的DAO都会具有SessionFactory的属性,从而可以通过SessionFactory创建实例操作数据库。
在继承HibrnateDaoSupport的实现里,Hibernate Session的管理完全不需要代码打开,而由来管理。Spring会根据实际的操作,采用&每次打开一次&的策略,自动提高数据库访问的性能。getSession&getHibernateTemplate用哪个?
在&Spring+Hibernate的集成环境里,如果DAO直接使用HibernateDaoSupport的getSession()方法获取&session进行数据操作而没有显式地关闭该session,那么程序表现为:每个session会打开一个connection,并且&connection会一直保持(因为没有显式地close).如果程序使用了c3p0连接池,则因为c3p0连接池默认最大连接数是15,程序会表现为当打开第15个连接时,程序处于停滞状态,等待从连接池获取新的连接.
  在同样条件下,使用HibernateTemplate进行数据操作,就没有连接数持续增长的情况,程序结束时连接数归零.这印证了spring文档上所说:HibernateTemplate会对session进行了管理,能够确保Session实例的正确打开和关闭.
  需要注意的是:在Spring环境里,即使我们使用Hibernate原生的API,比如这里所说的使用HibernateDaoSupport的getSession()方法得到Session进行数据操作(而不是使用Spring自己提供的API,比如HibernateTemplate),这些操作也依然会被纳入spring管理的事务中去.原因是通过getSession()方法得到Session是一个绑定到当前事务上的session.此处可参考:.这就是为什么Spring文档中提到的:You&can&implement&DAOs&based&on&the&plain&Hibernate&3&API,&while&still&being&able&to&participate&in&Spring-managed&transactions.
&&&&&如果程序使用了OpenSessionInViewFilter或者OpenSessionInViewInterceptor那将是另外一种情形了.
  简单总结:&HibernateDaoSupport的getSession()得到的Session会参与Spring管理的事务中,但是不能自动的关闭.&HibernateTemplate&除能参与到&Spring管理的事务中,还&能够确保Session实例的正确打开和关闭.
在myeclipse10.6中使用生成springDAO时,如果是hibernate4会直接生成
getCurrentSession().save(transientInstance)因为,hibernate4之后spring就没提供hibernateTemplate了;没有使用事务啊,没有关闭Session的操作。生成继承于BaseHibernateDAO的DAO是getSession().save(transientInstance);基本上没什么区别啊。
spring in action中说既然有了session就不需要再使用
HibernateTemplate&,直接使用getsession()就好,可是为什么在网上查的都是用HibernateTemplate&比较好呢。
群里询问,是说有HibernateTemplate&的封装当然好一些。但是现在都没用hibernate了&
在用springdatajpa 写个方法名就搞定了& hql sql
都没有& 也没有什么getsession
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。getHibernateTemplate()跟getSession()的区别 - 软件架构设计当前位置:& &&&getHibernateTemplate()跟getSession()的区别getHibernateTemplate()跟getSession()的区别&&网友分享于:&&浏览:9次getHibernateTemplate()和getSession()的区别
自动生成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 ( ) ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&& }) ;&&&&&&&&&&&&&&}本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/riyuecao316/archive//5672230.aspx
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 hibernate template 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信