SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明
2013-02-23 10:04
405 查看
SessionFactory
在接触HibernateTemplate之前,我们知道,在对数据库进行CRUD操作之前,需要开启session、transaction等等。在hibernate学习过程中,我们知道了,得到session之前,需要先得到SessionFactory,进而从SessionFactory里面openSession(),或者getCurrentSession(),接着开启一transaction,然后进行对数据库的操作,在操作结束后,提交事务,关闭session。当然如果session是通过getCurrentSession()得到的话,不用我们手动关闭。还有,关于异常的处理,这就涉及到事务的回滚。我们发现,这样逻辑的代码我们需要反复使用,每次session的历程都是这样的。实例代码如下:
[java] view
plaincopy
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里面!!!
[java] view
plaincopy
<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方式。
[java] view
plaincopy
<span style="font-size:18px;"><bean id="employeeDao" class="com.zzw.dao.impl.EmployeeDaoImpl">
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean></span>
[java] view
plaincopy
<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
[java] view
plaincopy
<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
[java] view
plaincopy
<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改为:
[java] view
plaincopy
<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注入方式,即第二种哦,亲!
在接触HibernateTemplate之前,我们知道,在对数据库进行CRUD操作之前,需要开启session、transaction等等。在hibernate学习过程中,我们知道了,得到session之前,需要先得到SessionFactory,进而从SessionFactory里面openSession(),或者getCurrentSession(),接着开启一transaction,然后进行对数据库的操作,在操作结束后,提交事务,关闭session。当然如果session是通过getCurrentSession()得到的话,不用我们手动关闭。还有,关于异常的处理,这就涉及到事务的回滚。我们发现,这样逻辑的代码我们需要反复使用,每次session的历程都是这样的。实例代码如下:
[java] view
plaincopy
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里面!!!
[java] view
plaincopy
<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方式。
[java] view
plaincopy
<span style="font-size:18px;"><bean id="employeeDao" class="com.zzw.dao.impl.EmployeeDaoImpl">
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean></span>
[java] view
plaincopy
<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
[java] view
plaincopy
<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
[java] view
plaincopy
<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改为:
[java] view
plaincopy
<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之间的关系说明
- SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明
- SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明
- SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明
- SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明
- 继承hibernateDaoSupport之后通过注解方式注入SessionFactory
- ssh HibernateDaoSupport spring 事务配置说明
- hibernate面试题 --- 类与类之间的有哪几种关系,并说明
- ssh2项目中,使用HibernateDaoSupport异常:'sessionFactory' or 'hibernateTemplate' is required
- 使用注解为HibernateDaoSupport注入sessionFactory
- 使用注解为HibernateDaoSupport注入sessionFactory
- 继承hibernateDaoSupport之后通过注解方式注入SessionFactory
- 使用注解为HibernateDaoSupport注入sessionFactory
- Spring整合的Hibernate的框架中,HibernateTemplate、SessionFactory和Session之间的关系
- [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))
- 关于DAO层的sessionFactory注入和是否继承HibernateDAOSupport
- 继承hibernateDaoSupport之后通过注解方式注入SessionFactory
- 使用注解为HibernateDaoSupport注入sessionFactory
- 继承HibernateDaoSupport后怎样获取session&&注入sessionFactory
- 使用注解为HibernateDaoSupport注入sessionFactory