熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

為什麼用Spring來管理Hibernate?

2013-11-23 20:32:30  來源: Java開源技術 
    為什麼要用Hibernate框架?這個在《Hibernate介紹》博客中已經提到了
   
    既然用Hibernate框架訪問管理持久層那為何又提到用Spring來管理以及整合Hibernate呢?
   
    首先我們來看一下Hibernate進行操作的步驟比如添加用戶的一個步驟在此為了解釋提出的問題只做一個截圖若想看完整代碼示例可以參考《八步詳解Hibernate的搭建及使用》
   
    看截圖可以看出Hibernate操作的步驟如下
   
    獲得Configuration對象
   
    創建SessionFactory
   
    創建Session
   
    打開事務
   
    進行持久化操作比如上面的添加用戶操作
   
    提交事務
   
    發生異常回滾事務
   
    關閉事務
   
    使用Hibernate進行訪問持久層每次都要進行這八個步驟但是若使用Spring對Hibernate進行管理又是怎麼樣的呢?
   
    首先Spring對Hibernate提供了HibernateTemple類這個模版類對session進行封裝並且Spring會默認為自動提交事務所在在dao層直接寫入thissave(Object)即可
   
    在實踐中遇到了一個問題無法插入數據庫經過一番折騰多次實驗驗證總結一下原因結果如下
   
    注意所有的操作都必須在事務中進行若單純的使用Hibernate則事務需要手動開啟提交關閉操作當然也可以在Hibernate配置文件中自動提交
   
    若使用Spring管理Hibernate則默認的是自動提交事務但是在此需要注意的是若使用Spring在配置文件中配置數據源而不使用hibernatecfgxml則可以成功插入數據庫因為HibernateTemple默認提供自動提交事務在Spring的配置文件配置數據源如下使用此數據源需要的jar如下commonsdbcpjarcommonspooljarmsbasejarmssqlserverjar msutiljarsqljdbcjar;
   
    <bean id=dataSource  class=monsdbcpBasicDataSource>
   
    <property name=driverClassName value=commicrosoftjdbcsqlserverSQLServerDriver>
   
    </property>
   
    <property name=url value=jdbc:sqlserver://:;database=test></property>
   
    <property name=username value=sa></property>      <property name=password value=></property>
   
    </bean>
   
    <bean id=sessionFactory class=orgspringframeworkormhibernateLocalSessionFactoryBean>
   
    <property name=dataSource ref=dataSource></property>
   
    <! hibernate屬性配置 >
   
    <property name=hibernateProperties>
   
    <props>
   
    <prop key=hibernatedialect>orghibernatedialectSQLServerDialect</prop>
   
    <prop key=hibernatehbmddlauto>update</prop>
   
    </props>
   
    </property>
   
    !         如果采用傳統的hbmxml的方式可以采用如下方式來簡化注冊hbmxml的步驟並且class為LocalSessionFactoryBean >
   
    <property name=mappingLocations>
   
    <list>
   
    <value>classpath:Userhbmxml</value>
   
    </list>
   
    </property>
   
    </bean>
   
    若Spring中不是直接配置數據源而是使用hibernatecfgxml則是無法若直接thissave(Object)則無法插入數據庫中但是可以保存中緩存中因為所有的操作都是在事務中執行的而hibernatecfgxml數據源則默認是不是自動提交的解決的辦法如下可以在hibernatecfgxml中填寫
   
    <property name=nnectionautocommit>true</property>
   
    以下Spring使用hibernatecfgxml數據源
   
    <bean id=sessionFactory class=orgspringframeworkormhibernateLocalSessionFactoryBean>
   
    <property name=configLocation>
   
    <value>classpath:hibernatecfgxml</value>
   
    </property>
   
    <property name=mappingLocations>
   
    <list>
   
    <value>classpath:Userhbmxml</value>
   
    </list>
   
    </property>
   
    </bean>
   
    以上介紹了Spring來管理Hibernate的好處在於不用手動創建SessionFactorySession不用手動開啟提交關閉事務這一切完全都是由Spring來管理並且Spring還提供了HibernateTemple的工具使一切操作簡單方便
   
    dao層在Spring配置文件中配置如下
   
    《span >bean id=userDao class=comUserDaoUserDaoImpl>
   
    <property name=sessionFactory ref=sessionFactory></property>
   
    </bean></span>
   
    則在dao層的代碼如下
   
    package comUserDao;
   
    import orgspringframeworkormhibernateHibernateTemplate;
   
    import comuserUser;
   
    public class UserDaoImpl extends HibernateTemplate implements UserDao {
   
    @Override
   
    public void insert(User user) {
   
    thissave(user)
   
    }
   
    }
   
    這只是其中的關鍵的代碼至於完整的小demo已經上傳
   
    正如上述所說一切操作盡在事務中事務這個概念想必大家不陌生吧一般情況事務應該在業務邏輯層而不是在dao層應用並且Spring對事務有很好的封裝自己有一套事務管理的封裝使業務邏輯與事務管理分離進一步達到解耦作用下一篇博客我們繼續會講解Spring管理Hibernate中的事務管理
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28636.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.