zoukankan      html  css  js  c++  java
  • 为什么用Spring来管理Hibernate? <转>

    为什么要用Hibernate框架?这个在Hibernate介绍》博客中已经提到了。

    既然用Hibernate框架访问管理持久层,那为何又提到用Spring来管理以及整合Hibernate呢?

    首先我们来看一下Hibernate进行操作的步骤。比如添加用户的一个步骤。在上一篇博客中《八步详解Hibernate的搭建及使用》详细介绍到了Hibernate使用的步骤。以下的代码来自上篇博客,在此为了解释提出的问题,只做一个截图,若想看完整代码示例,可以参考《八步详解Hibernate的搭建及使用》

    看截图,可以看出,Hibernate操作的步骤如下:

    1.      获得Configuration对象

    2.      创建SessionFactory

    3.      创建Session

    4.      打开事务

    5.      进行持久化操作。比如上面的添加用户操作

    6.      提交事务

    7.      发生异常,回滚事务

    8.      关闭事务

    使用Hibernate进行访问持久层,每次都要进行这八个步骤。但是若使用Spring对Hibernate进行管理,又是怎么样的呢?

    首先,Spring对Hibernate提供了HibernateTemple类。这个模版类对session进行封装。并且Spring会默认为自动提交事务。所在在dao层直接写入this.save(Object)即可。

    在实践中,遇到了一个问题,无法插入数据库,经过一番折腾,多次实验,验证,总结一下原因,结果如下:

    注意:所有的操作都必须在事务中进行若单纯的使用Hibernate,则事务需要手动开启提交关闭操作。当然也可以在Hibernate配置文件中,自动提交。

    若使用Spring管理Hibernate,则默认的是自动提交事务。但是在此,需要注意的是:若使用Spring在配置文件中配置数据源而不使用hibernate.cfg.xml,则可以成功插入数据库,因为HibernateTemple默认提供自动提交事务。在Spring的配置文件配置数据源如下:使用此数据源需要的jar如下:commons-dbcp.jar,commons-pool.jar,msbase.jar,mssqlserver.jar, msutil.jar,sqljdbc4.jar;

    1. <bean id="dataSource"  class="org.apache.commons.dbcp.BasicDataSource">  
    2.     <property name="driverClassName" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"></property>  
    3.     <property name="url" value="jdbc:sqlserver://192.168.24.176:1433;database=test"></property>  
    4.     <property name="username" value="sa"></property>  
    5.     <property name="password" value="123"></property>  
    6. </bean>  
    7. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    8.     <property name="dataSource" ref="dataSource"></property>      
    9.     <!-- hibernate属性配置 -->  
    10.     <property name="hibernateProperties">  
    11.         <props>  
    12.             <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>  
    13.             <prop key="hibernate.hbm2ddl.auto">update</prop>  
    14.         </props>  
    15.     </property>  
    16. lt;!--      如果采用传统的hbm.xml的方式,可以采用如下方式来简化注册hbm.xml的步骤,并且class为LocalSessionFactoryBean -->  
    17.     <property name="mappingLocations">  
    18.         <list>  
    19.             <value>classpath:User.hbm.xml</value>  
    20.         </list>  
    21.     </property>  
    22. </bean>  

    若Spring中不是直接配置数据源,而是使用hibernate.cfg.xml,则是无法若直接this.save(Object),则无法插入数据库中,但是可以保存中缓存中。因为所有的操作都是在事务中执行的,而hibernate.cfg.xml数据源则默认是不是自动提交的。解决的办法如下:可以在hibernate.cfg.xml中填写:

    <property name="hibernate.connection.autocommit">true</property>

    以下Spring使用hibernate.cfg.xml数据源

    1. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    2.      <property name="configLocation">  
    3.             <value>classpath:hibernate.cfg.xml</value>  
    4.         </property>  
    5.     <property name="mappingLocations">  
    6.             <list>  
    7.                 <value>classpath:User.hbm.xml</value>  
    8.             </list>  
    9.     </property>  
    10.     </bean>   

    以上,介绍了Spring来管理Hibernate的好处在于,不用手动创建SessionFactory,Session,不用手动开启提交关闭事务,这一切完全都是由Spring来管理。并且 Spring还提供了HibernateTemple的工具,使一切操作简单方便。

    dao层在Spring配置文件中配置如下:

    1. <<span style="font-size:12px;">bean id="userDao" class="com.UserDao.UserDaoImpl">  
    2.     <property name="sessionFactory" ref="sessionFactory"></property>  
    3. </bean></span>  

    则在dao层的代码如下:

    1. package com.UserDao;  
    2. import org.springframework.orm.hibernate3.HibernateTemplate;  
    3. import com.user.User;  
    4.   
    5. public class UserDaoImpl extends HibernateTemplate implements UserDao {  
    6. @Override  
    7.     public void insert(User user) {  
    8.         this.save(user);      
    9.     }  
    10. }  

    这只是其中的关键的代码,至于完整的小demo,已经上传
     

    正如上述所说,一切操作尽在事务中,事务这个概念想必大家不陌生吧,一般情况,事务应该在业务逻辑层,而不是在dao层应用。并且Spring对事务有很好的封装,自己有一套事务管理的封装,使业务逻辑与事务管理分离,进一步达到解耦作用。下一篇博客,我们继续会讲解Spring管理Hibernate中的事务管理。

    原文网址:http://blog.csdn.net/llhhyy1989/article/details/7430086

  • 相关阅读:
    【Java EE 学习 81】【CXF框架】【CXF整合Spring】
    【Java EE 学习 80 下】【调用WebService服务的四种方式】【WebService中的注解】
    【Java EE 学习 80 上】【WebService】
    【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】
    【Java EE 学习 79 上】【mybatis 基本使用方法】
    【Java EE 学习 78 下】【数据采集系统第十天】【数据采集系统完成】
    【Java EE 学习 78 中】【数据采集系统第十天】【Spring远程调用】
    【Java EE 学习 78 上】【数据采集系统第十天】【Service使用Spring缓存模块】
    【Java EE 学习 77 下】【数据采集系统第九天】【使用spring实现答案水平分库】【未解决问题:分库查询问题】
    【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】
  • 原文地址:https://www.cnblogs.com/winkey4986/p/2453903.html
Copyright © 2011-2022 走看看