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 }