SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明
在接触HibernateTemplate之前,我们知道,在对数据库进行CRUD操作之前,需要开启session、transaction等等。在hibernate学习过程中,我们知道了,得到session之前,需要先得到SessionFactory,进而从SessionFactory里面openSession(),或者getCurrentSession(),接着开启一transaction,然后进行对数据库的操作,在操作结束后,提交事务,关闭session。当然如果session是通过getCurrentSession()得到的话,不用我们手动关闭。还有,关于异常的处理,这就涉及到事务的回滚。我们发现,这样逻辑的代码我们需要反复使用,每次session的历程都是这样的。实例代码如下:
- public class HibernateCoreAPITest {
- private static SessionFactory sessionFactory;
- @BeforeClass
- public static void beforeClass() {
- sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
- }
- @AfterClass
- public static void afterClass() {
- sessionFactory.close();
- }
- @Test
- public void testTeacherSave() {
- Teacher t = new Teacher();
- t.setName("t1");
- t.setTitle("middle");
- t.setBirthDate(new Date());
- //Session session = sessionFactory.openSession();
- Session session = sessionFactory.getCurrentSession();
- session.beginTransaction();
- session.save(t);
- session.getTransaction().commit();
- }
HibernateTemplate
从上面测试用的代码(省略了异常处理和事务回滚)来看,如果在业务层某部分的功能模块比较多,那我们不得不老实重复关于session的代码。为避免这样的窘境,于是有了HibernateTemplate的出现。
给HibernateTemplate注入SessionFactory,我们就能获得利用SessionFactory来create sessionFactory,进而进行所有关于sessionFactory的功能操作。同时,由于HibernateTemplate本身关于sessionFactory的处理原理,我们不再需要手动编写关于sessionFactory、session、transaction等等代码。我们只需要编写关于业务逻辑相关的操作,其他的一并由HibernateTemplate完成。HibernateTemplate的这种设计模式我们称之为TemplateMethod,采用的方式叫callback或者钩子函数。这里的重点就是把SessionFactory注入到HibernateTemplate里面!!!
- <span style="font-size:18px;">@Component("employeeDao")
- public class EmployeeDaoImpl implements EmployeeDao {
- private HibernateTemplate hibernateTemplate;
- public HibernateTemplate getHibernateTemplate() {
- return hibernateTemplate;
- }
- @Resource
- public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
- this.hibernateTemplate = hibernateTemplate;
- }
- @Override
- public void save(Employee employee) {
- hibernateTemplate().save(employee);
- }</span>
上面的代码采用的是annotation方式,当然我们也可以使用xml方式,一样很简单。
HibernateDaoSupport
HibernateDaoSupport对于HibernateTemplate,就好比HibernateTemplate对于SessionFactory,两两的关系,大致雷同。只是这一次,HibernateDaoSupport是需要被继承的,而且不能像后者那样减少什么的代码量。就是把HibernateTemplate注入到HibernateDaoSupport里面,当然把SessionFactory注入到HibernateDaoTemplate里面一样可以。而起由于在HibernateDaoSupport里面set方法是final类型的,我们不能够重写该方法,所以就不能过通过annotation方式注入HibernateTemplate,只有采用xml方式。
- <span style="font-size:18px;"><bean id="employeeDao" class="com.zzw.dao.impl.EmployeeDaoImpl">
- <property name="hibernateTemplate" ref="hibernateTemplate"></property>
- </bean></span>
- <span style="font-size:18px;">public class EmployeeDaoImpl extends HibernateDaoSupport implements EmployeeDao {
- @Override
- public void save(Employee employee) {
- this.getHibernateTemplate().save(employee);
- }
- @Override
- public void delete(Employee employee) {
- this.getHibernateTemplate().delete(employee);
- }
- @Override
- public void update(Employee employee) {
- this.getHibernateTemplate().update(employee);
- }</span>
接着,我们来谈谈HibernateDaoSupport的拓展,当多个***Dao需要注入继承HibernateDaoSupport的时候,理所当然,我们得在applicationContext.xml里面给每个Dao注入hibernateTemplate或者sessionFactory。少量的好说,但是如果很多,比如几百个Dao(当然,这种情况我们很少遇到,我们假设这样),这样,由于采用的是xml方式,我们配置起来一样显得麻烦。这个时候,我们可以这样解决,抽象一个顶层Dao类,这个类必须注入HibernateTemplate,其实这个注入了HibernateTemplate的顶层Dao类,他的功能类似于HibernateDaoSupport类,唯一的不同就是这个类里面的set方法是我们自己定义的,不是final类型的,所以我们采用注解annotation方式注入HibernateTemplate。然后,让那些***Dao继承这个顶层Dao类。这样在xml里面不用编写任何的注解配置,当然除了在HibernateTemplate里面注入sessionFactory。
注入HibernateTemplate的顶层Dao类:SuperDao.java
- <span style="font-size:18px;">import javax.annotation.Resource;
- import org.springframework.orm.hibernate3.HibernateTemplate;
- import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
- import org.springframework.stereotype.Component;
- @Component
- public class SuperDAO {
- private HibernateTemplate hibernateTemplate;
- public HibernateTemplate getHibernateTemplate() {
- return hibernateTemplate;
- }
- @Resource
- public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
- this.hibernateTemplate = hibernateTemplate;
- }
- }</span>
众多***Dao里面的一实例:UserDao.java
- <span style="font-size:18px;">@Component("userDAO")
- public class UserDAOImpl extends SuperDAO implements UserDAO {
- public void save(User user) {
- this.getHibernateTemplate().save(user);
- }
- }</span>
从上面的代码中,我们发现整个过程我们并没有使用HibernateDaoSupport这个抽象类,而是使用一个它的替代类:由我们自己定义的。如果非得使用HibernateDaoSupport类的话,也可以,就是讲顶层Dao类SuperDao改为:
- <span style="font-size:18px;">@Component
- public class SuperDAO extends HibernateDaoSupport {
- @Resource(name="hibernateTemplate")
- public void setSuperHibernateTemplate(HibernateTemplate hibernateTemplate) {
- super.setHibernateTemplate(hibernateTemplate);
- }
- }
- </span>
注意:spring容器在对子类进行初始化的时候,首先会将其父类进行初始化,而如果两者的注入方式不一致,比如一个是xml方式,一个是annotation方式的话,很容易出错,所以,最好使用同种注入方式!
最后,温馨提示:建议使用HibernateTemplate的annotation注入方式,即第二种哦,亲!
SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明的更多相关文章
- 通俗易懂理清mybatis中SqlSessionSql、SqlSessionTemplate、SessionFactory和SqlSessionFactoryBean之间的关系
		我潇洒的灰大狼又回来啦.今天送大家的一句话是: 保持耐心,永远年轻,永远热泪盈眶. 前言 先容我哭一会儿,呜呜呜~昨晚写了一半的文章,还没保存就盖上盖子准备回家,拔下电源准备把电脑塞进书包带回家完成时 ... 
- JPA概述以及它和Hibernate之间的关系
		http://www.cnblogs.com/Kevin-ZhangCG/p/8996491.html 一.JPA概述以及它和Hibernate之间的关系 1.1.Hibernate 概述 JPA J ... 
- 五、hibernate表与表之间的关系(一对多关系)
		数据库表与表之间的关系 一对多:一个学校可以有多个学生,一个学生只能有一个学校 多对多:一个学生可以有多个老师,一个老师可以教多个学生 一对一:一个人只能有一个身份证号,一个身份证号只能找到一个人 一 ... 
- .NET Core与.NET Framework、Mono之间的关系
		随着微软的.NET开源的推进,现在在.NET的实现上有了三个.NET Framework,Mono和.NET Core.经常被问起Mono的稳定性怎么样,后续Mono的前景如何,要回答这个问题就需要搞 ... 
- .NET Core 和 .NET Framework 之间的关系
		引用一段描述:Understanding the relationship between .NET Core and the .NET Framework. .NET Core and the .N ... 
- 实体之间的关系【Entity Relationships】(EF基础系列篇9)
		Here, you will learn how entity framework manages the relationships between entities. Entity framewo ... 
- php CGI、Fastcgi、PHP-FPM的详细介绍与之间的关系
		以下PHP CGI.Fastcgi.PHP-FPM的一些信息归纳和汇总----->详细介绍与之间的关系 一:CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的 web ... 
- [转] valuestack,stackContext,ActionContext.之间的关系
		三者之间的关系如下图所示: ActionContext 一次Action调用都会创建一个ActionContext 调用:ActionContext context = ActionContext ... 
- angular源码阅读,依赖注入的原理:injector,provider,module之间的关系。
		最开始使用angular的时候,总是觉得它的依赖注入方式非常神奇. 如果你跳槽的时候对新公司说,我曾经使用过angular,那他们肯定会问你angular的依赖注入原理是什么? 这篇博客其实是angu ... 
随机推荐
- Selenium Tutorial (1) - Starting with Selenium WebDriver
			Starting with Selenium WebDriver Selenium WebDriver - Introduction & Features How Selenium WebDr ... 
- erlang reduction
			“首先明确一点,Erlang的process的调度是抢占式的,而非couroutine的协作式的.其次,Erlang早期版本是只有一个调度器,运行在一个线程上,随着erts的发展,现在erlang的调 ... 
- 数据库语言(二):SQL语法实例整理
			连接表达式: select * from student join takes on student.ID = takes.ID; 通过on后面的谓词作为连接条件,相同的属性可以出现两次,也就是等价于 ... 
- 转载RabbitMQ入门(3)--发布和订阅
			发布和订阅 (使用java 客户端) 在先前的指南中,我们创建了一个工作队列.这工作队列后面的假想是每一个任务都被准确的传递给工作者.在这部分我们将会做一些完全不同的事情–我们将一个消息传递给多个消费 ... 
- 【编程之美】计算1-N中含1的个数
			转自:点我 1位数的情况: 在解法二中已经分析过,大于等于1的时候,有1个,小于1就没有. 2位数的情况: N=13,个位数出现的1的次数为2,分别为1和11,十位数出现1的次数为4,分别为10,1 ... 
- Web开发人员必备工具-Emmet (Zen Coding)
			如果你从事前端开发或者web开发的话,一定听说过Zen coding - 一种快速编写HTML/CSS代码的方法.它使用仿CSS选择器的语法来快速开发HTML和CSS - 由Sergey Chikuy ... 
- c# List<int> 转 string 以及 string [] 转 List<int>
			List<int> 转 string : list<int>: 1,2,3,4,5,6,7 转换成字符串:“1,2,3,4,5,6,7” List<int> li ... 
- hdu 3635 Dragon Balls(加权并查集)2010 ACM-ICPC Multi-University Training Contest(19)
			这道题说,在很久很久以前,有一个故事.故事的名字叫龙珠.后来,龙珠不知道出了什么问题,从7个变成了n个. 在悟空所在的国家里有n个城市,每个城市有1个龙珠,第i个城市有第i个龙珠. 然后,每经过一段时 ... 
- oracle返回多结果集
			kavy 原文 oracle返回多结果集 Oracle存储过程: create or replace procedure P_Sel_TopCount2(in_top in number, out_c ... 
- PagerSlidingTabStrip 高亮选中标题
			1.选中标题后,高亮标题@Override public void onPageSelected(int position) { setSelectTextColor(position); if (d ... 
