zoukankan      html  css  js  c++  java
  • HibernateTemplate和HibernateDaoSupport(spring注入问题)

    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编码如下:

    publicclass ManageEmpDaoImpl extendsHibernateDaoSupport implementsManageEmpDao{

    publicvoid addEmp(Emp emp) {

    this.getHibernateTemplate().save(emp);

    }

    publicList<Emp> getEmpList() {

    returnnull;

    }

    }

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

    2>注入HibernateTemplate

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

    配置文件如下所示:

    <beanid="hibernateTemplate"

    class="org.springframework.orm.hibernate3.HibernateTemplate">

    <propertyname="sessionFactory"ref="sessionFactory"/>

    </bean>

    <beanid="manageEmpDaoImpl"class="com.cyou.lms.emp.manageemp.dao.impl.ManageEmpDaoImpl">

    <propertyname="hibernateTemplate"ref="hibernateTemplate"/>

    </bean>

    DAO编码如下所示:

    publicclass ManageEmpDaoImpl implementsManageEmpDao {

    privateHibernateTemplate hibernateTemplate;

    publicvoid addEmp(Emp emp) {

    this.hibernateTemplate.save(emp);

    }

    publicList<Emp> getEmpList() {

    returnnull;

    }

    publicHibernateTemplate getHibernateTemplate() {

    returnhibernateTemplate;

    }

    publicvoid setHibernateTemplate(HibernateTemplate hibernateTemplate) {

    this.hibernateTemplate= hibernateTemplate;

    }

    }

     

     

    前者代码虽然简便,但是继承了HibernateDaoSupport之后,没有办法再继承别的类了.用什么就看个人喜好了。

    在实际使用中,如果持久层继承HibernateDaoSupport的话,那么每个持久层的类,都需要注入SessionFactory,非常麻烦,

    有一个便捷方法: 可以自己写一个类(比如BaseDao),继承HibernatedaoSupport,把SessionFactory或者HibernateTemplate注入到这个类中,

    其他的持久层XXXDao类继承此BaseDao类即可。

    相应的配置文件可以这样写:

    1.用HibernateTemplate的类时的配置文件如下:

    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties" ref="hibernate-hibernateProperties"></property>
    <property name="packagesToScan" ref="hibernate-packagesToScan"></property>
    <property name="mappingLocations" ref="hibernate-mappingLocations"></property>
    </bean>

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <bean id="baseHibernateDao" class="cn.com.ksplatform.base.dao.BaseHibernateDAO"
    parent="hibernateTemplate"></bean>

    2.使用HibernateSupportDao类时的配置文件的写法:

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation" value="classpath:hibernate.cfg.xml" />
    </bean>

    <bean id="baseDao" class="com.gcflower.dao.BaseDao">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean>

  • 相关阅读:
    Different AG groups have the exactly same group_id value if the group names are same and the ‘CLUSTER_TYPE = EXTERNAL/NONE’
    An example of polybase for Oracle
    use azure data studio to create external table for oracle
    Missing MSI and MSP files
    You may fail to backup log or restore log after TDE certification/key rotation.
    Password is required when adding a database to AG group if the database has a master key
    Use KTPASS instead of adden to configure mssql.keytab
    ardunio+舵机
    android webview 全屏100%显示图片
    glide 长方形图片显示圆角问题
  • 原文地址:https://www.cnblogs.com/zhangshitong/p/5980591.html
Copyright © 2011-2022 走看看