Spring的HibernateDaoSupport类详解

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

HibernateDaoSupport:

(创建一个子类对象的时候,会先创建一个父类对象)。

当LogDAOImpl继承HibernateDaoSupport的时候,程序执行报错,原因是必须要注入SessionFactory或者HibernateTemplate。因为HibernateDaoSupport是abstract类,所以无法生成HibernateDaoSupport对象来实现注入;那我们只能生成其子类LogDAOImpl的对象,在调用HibernateDaoSupport类中的set方法进行注入,但这个方法还是不行,因为HibernateDaoSupport类中的set方法为final方法。总之,我们无法使用annotation方式在HibernateDaoSupport中注入SessionFactory或者HibernateTemplate。,那么我们的LogDAOImpl类就不能使用annotation的方式生成了,我们只能(暂且,以后会有其他方法)在beans.xml中进行注入如下:

使用这种方式进行注入,我们又会有另外一个问题:假如现在有很多的DAO的实现需要继承HibernateDaoSupport,那么我们在beans.xml文件中就需要配很多的,这样仅配置文件就非常庞大了。

到现在,我们已经知道了HibernateDaoSupport怎么使用了。

使用上面的方法直接继承HibernateDaoSupport比较复杂,现在介绍一种简便的方法:我们可以把DAO抽象处理,写一个抽象类,让它去继承HibernateDaoSupport,如下:

如下修改beans.xml文件,将sessionFactory注入给它:

然后在DAO实现中继承,如下:

这样,如果我们再有一个DAO的实现,我们只要再写一个实现类即可,而无须在beans.xml文件中再进行一个配置。

综上,如果要使用HibernateDaoSupport的话,就采用这样的方法:抽象出DAO,让它去继承HibernateDaoSupport,所有DAO实现继承这个抽象的DAO,在beans.xml只要将这个抽象的DAO,也就是顶层的DAO初始化bean则可。这样,在DAO实现中又可以使用annotation。

但这种方式经过实验不行,运行的时候还是无法配置一次就可以在很多DAO实现中使用,仍然会报错说需要SessionFactory或者HibernateTemplate。原因是:当我们在调用DAO 实现的时候,确确实实会初始化父类DAO对象,这个初始化过程Spring确实也能帮我们管理起来,但是,现在的问题是由于我们在DAO实现中使用的是annotation,而父类的初始化用的是beans.xml方式,所以子类和父类的初始化方式不匹配。怎么证明呢?现在我们的父类DAO我们不使用xml方式,而是采用annotation方式来初始化。但是,使用annotation 方式,父类DAO是继承HibernateDaoSupport,上面已经分析了,继承自HibernateDaoSupport 我们又无法注入SessionFactory或者HibernateTemplate。

最后,我们干脆不要HibernateDaoSupport了。继承自HibernateDaoSupport抽象类是因为我们可以不用在每个DAO实现类里面写HibernateTemplate,然而继承自HibernateDaoSupport,我们却又无法注入SessionFactory或者HibernateTemplate,程序报错。那现在我们干脆就不继承自HibernateDaoSupport了,而是我们自己抽象出父类DAO,我们在父类DAO中自己实现注入HibernateTemplate(annotation方式,与子类初始化方式一致)。如下:

父类DAO实现了HibernateTemplate注入,那么我们在DAO实现类中就可以直接使用HibernateTemplate了,如下:

总结:HibernateDaoSupport不重要,不需要。继承HibernateDaoSupport可以使我们不用在每个子类(DAO实现)中注入HibernateDaoSupport,但HibernateDaoSupport只能在beans.xml文件中配置,当子类使用annotation注入方式,则会出现父类和子类注入方式不匹配的错误。所以我们不要继承自HibernateDaoSupport了,而是抽象出一个父类DAO,在父类DAO中使用annotation方式注入HibernateTemplate,这样,子类(同样使用annotation 方式注入)继承自父类DAO,就同时拥有了父类DAO已经注入的HibernateTemplate,可以直接使用this.getHibernateTemplate().save(user),这样就不用再每一个DAO实现中都注入HibernateTemplate,既完成了HibernateDaoSupport的功能,有免去了HibernateDaoSupport 所带来的麻烦。最后得出结论,HibernateDaoSupport没有用。

相关文档
最新文档