开发者社区> 问答> 正文

关于Spring hibernateTemplate怎么注入?

个数据访问层都对hibernateTemplate进行了注入,现想可不可以拦截DAO层,通过配置给每个层的hibernateTemplate进行注入?具体的实例更好

展开
收起
小旋风柴进 2016-03-04 14:30:57 2249 0
1 条回答
写回答
取消 提交回答
  • HibernateTemplate
    HibernateTemplate是Spring提供的一个就Hibernate访问持久层技术而言、支持Dao组件的一个工具。HibernateTemplate提供持久层访问模板,应用HibernateTemplate无须实现特定的接口,它只需要提供一个sessionFactory的引用就可以执行持久化操作。
    该模板无需打开session及关闭Session。它只要获得SessionFactory的引用,就可以打开Session,并在持久化访问结束后关闭Session,程序开发只需要完成持久层逻辑,通用的CRUD操作由HibernateTemplate完成.
    HibernateDaoSupport
    HibernateDaoSupport同样也是Spring提供的、为Hibernate访问数据库的DAO组件:该类主要提供如下两个方法,方便DAO的实现:
    1>public final HibernateTemplate getHibernateTemplate()
    2>public final void setSessionFactory(SessionFactory sessionFactory)
    其中setSessionFactory方法用来接收Spring的ApplicationContext的依赖注入,可接收配置在Spring的SessionFactory实例,getHibernateTemplate方法则用来生成HibernateTeplate模板对象来完成数据库访问。
    同样常用HibernateDaoSupport中的getSession方法来获取Session对象对数据库进行操作,相对HibernateTemplate对象而言,HibernateDaoSupport应用更加灵活。
    配置方案——Spring+hibernate访问数据库有以下几种方法:
    1>注入SessionFactory

    在spring配置文件中,对Dao注入sessionFactory,如下所示
    配置文件相关配置如下:

    <bean id="manageEmpDaoImpl"
    class="com.cyou.lms.emp.manageemp.dao.impl.ManageEmpDaoImpl">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    Dao编码如下:
    public class ManageEmpDaoImpl extends HibernateDaoSupport implements ManageEmpDao{
    public void addEmp(Emp emp) {
    this.getHibernateTemplate().save(emp);
    }
    public List getEmpList() {
    return null;
    }
    }

    这里的sessionFacotry注入不是给类的,而是给继承HibernateDaoSupport类的sessionFactory,在上面源码中可以看到。这样编写的一个好处就是我们不再需要关心关闭、是否连接成功等问题。主要是很方便。但是这个不好就是java只支持单继承,所以唯一的继承给了HibernateDaoSupport有点可惜。而且也没有必要这样做。
    2>注入HibernateTemplate

    这种方法本质上跟上面的sessionFacotry一样,只不过进行了一层包装,好处就是Dao中的类就不用再继承那个HibernateDaoSuport了,不过要先配置好HibernateTemplate:
    配置文件如下所示:

    <bean id="hibernateTemplate"
    class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <bean id="manageEmpDaoImpl"class="com.cyou.lms.emp.manageemp.dao.impl.ManageEmpDaoImpl">
    <property name="hibernateTemplate" ref="hibernateTemplate" />
    </bean>
    DAO编码如下所示:
    public class ManageEmpDaoImpl implements ManageEmpDao {
    private HibernateTemplate hibernateTemplate;
    public void addEmp(Emp emp) {
    this.hibernateTemplate.save(emp);
    }
    public List getEmpList() {
    return null;
    }
    public HibernateTemplate getHibernateTemplate() {
    return hibernateTemplate;
    }
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
    this.hibernateTemplate = hibernateTemplate;
    }
    }
    

    前者代码虽然简便,但是继承了HibernateDaoSupport之后,没有办法再继承别的类了.用什么就看个人喜好了。
    在实际使用中,如果持久层继承HibernateDaoSupport的话,那么每个持久层的类,都需要注入SessionFactory,非常麻烦,
    有一个便捷方法: 可以自己写一个类,继承HibernatedaoSupport,把SessionFactory或者HibernateTemplate注入到这个类中,
    持久层继承此类。

    2019-07-17 18:52:16
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多