将sessionFactory 注入给 hibernateTemplate,让hibernateTemplate帮我们完成一些模板代码
1 2 34 5
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 //注入HibernateTemplate10 @Resource11 public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {12 this.hibernateTemplate = hibernateTemplate;13 }14 15 @Override16 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 @Resource11 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 }