10.Spring整合Hibernate_3_HibernateTemplate

将sessionFactory 注入给 hibernateTemplate,让hibernateTemplate帮我们完成一些模板代码
1     
2 <!-- 使用HibernateTemplate -->
3     <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
4         <property name="sessionFactory" ref="sessionFactory"></property>
5     </bean>

HibernateTemplate的使用:

  

 1 @Component("userDAO") 
 2 public class UserDAOImpl implements UserDAO{
 3     HibernateTemplate hibernateTemplate = null;
 4 
 5     public HibernateTemplate getHibernateTemplate() {
 6         return hibernateTemplate;
 7     }
 8     
 9     //注入HibernateTemplate
10     @Resource
11     public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
12         this.hibernateTemplate = hibernateTemplate;
13     }
14 
15     @Override
16     public void save(User user) {
17         //让 HibernateTemplate帮我来创建session,提交session,我只需要填 中间 最核心的( 调用 Session的 哪个方法)
18         //这体现了 一种设计模式:Template Method(模板方法)  只需要让你填最核心的内容,其他重复的东西 我帮你写
19         //具体实现过程:1.当  hibernateTemplate.save 执行后, hibernateTemplate因为有sessionFactory,所以可以帮我们完成:session的创建,事务的开启等
20         //2.之后 hibernateTemplate 会调用  HibernateCallback 把这个 session 交给  HibernateCallback的  doInHibernate方法
21         //3.在HibernateCallback的  doInHibernate 方法中,调用session的save方法
22 //即hibernateTemplate完成一些模板代码,而HibernateCallback 回调 核心代码
23         //所以   Callback:回调/钩子函数
24         hibernateTemplate.save(user);        
25     }
26     
27     
28 }

第二种方式:
  

 1 //为所有DAOImpl创建一个父类,里面注入了HibernateTemplate,所有子类都可以直接使用父类的 
 2 @Component
 3 public class SuperDAO {
 4     private HibernateTemplate hibernateTemplate;
 5 
 6     public HibernateTemplate getHibernateTemplate() {
 7         return hibernateTemplate;
 8     }
 9     
10     @Resource
11     public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
12         this.hibernateTemplate = hibernateTemplate;
13     }
14 
15 }
 1 @Component("logDAO") 
 2 public class LogDAOImpl extends SuperDAO implements LogDAO{
 3     
 4     //继承的父类DAO中 注入了 HibernateTemplate  所以子类中可以直接使用
 5     @Override
 6     public void saveMsg(Log log) {
 7         this.getHibernateTemplate().save(log);
 8     }
 9     
10     
11 }

第三种方式:
  

 1 //另外的一种解决方案
 2 //继承DaoSupport,写一个 set,将SessionFactory 注入到这个这个方法,然后,super.setSessionFactory  这样父类就有了 sessionFactory 
 3 //使用Spring的 注入的 时候 ,是把bean对象注入到 set 方法的参数里面
 4 
 5 @Component
 6 public class SuperDAO extends HibernateDaoSupport {
 7     
 8     @Resource(name="sessionFactory")
 9     public void setSupperSessionFactory(SessionFactory sessionFactory) {
10         super.setSessionFactory(sessionFactory);
11     }
12 }
原文地址:https://www.cnblogs.com/xuzekun/p/7400184.html