1. 程式人生 > >Spring+Hibernate操作持久層HibernateTemplate與HibernateTransactionManager

Spring+Hibernate操作持久層HibernateTemplate與HibernateTransactionManager

Spring對Hibernate有很好的支援
   

DataSource ->SessionFactory-> HibernateTranscationManager
Hibernate中通過SessionFactory建立和維護Session。Spring對SessionFactory的配置進行了整合,無需再通過Hibernate.cfg.xml對SessionFactory進行設定。SessionFactory節點的mappingResources屬性包含了對映檔案的路徑,list節點下可配置多個對映檔案。hibernateProperties節點則容納了所有的屬性配置。可以對應傳統的Hibernate.cfg.xml檔案結構對這裡的SessionFactory配置進行解讀。

如果一個方法中既用了HibernateTemplate,又用了JdbcTemplate,應該怎麼配單例項的db事務呢(多例免談)用 DataSouceTransactionManager是不行的,而用HibernateTransactionManager就可以保證
原因的話看下它們原始碼,會發現HibernateTransactionManager中的處理可以保證SessionFactoryUtil和datasourceutil都能在一個事務裡取到同一個連線

所以如果使用hibernateTransactionManager的話,就完全可以保證SessionFactoryUtil和datasourceutil都能在一個事務裡取到同一個連線!所有的疑問煙消雲散了,
所以大家還是使用hibernateTransactionManager從而隨心所欲的使用jdbctemplate和hibernatetemplate吧

    下面是HibernateSessionFactory 和 HibernateTransactionManager的配置:

    在applicationContext-hibernate.xml中:

 1<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
 2    <property name="dataSource"><ref bean="dataSource"/></property>
 3    <property name="mappingResources">
 4        <list>
 5            <value>com/mycompany/model/User.hbm.xml</value>
 6                ……………………………
 7        </list>
 8    </property>
 9    <property name="hibernateProperties">
10    <props>
11        <prop key="hibernate.dialect">@

[email protected]</prop>
12        <!--prop key="hibernate.show_sql">true</prop-->
13        <!--prop key="hibernate.hbm2ddl.auto">update</prop-->
14    </props>
15    </property>
16</bean>

    Spring 提供了一個 HibernateTransactionManager,採用面向Hibernate的TransactionManager實現:org.springframework.orm.hibernate.HibernateTransactionManager。他用執行緒捆綁了一個Hibernate Session,用它來支援transactions。
1<bean id="transactionManager" 
2     class="org.springframework.orm.hibernate.HibernateTransactionManager">
3     <property name="sessionFactory"><ref local="sessionFactory"/></property>
4 </bean>

sessionFactory Bean引用了HibernateSessionFactory,而transactionManager Bean引用了HibernateTransactionManage。 transactionManager Bean中有個sessionFactory屬性。HibernateTransactionManager有個sessionFactory setter 和 getter方法,用來在Spring啟動的時候實現“依賴注入” (dependency injection)的。 在sessionFactory 屬性裡引用sessionFactory Bean。這兩個物件在Spring容器初始化後就被組裝了起來了。
  
    User使用一個TransactionProxyFactoryBean,它定義了一個setTransactionManager()。能很方便的處理申明的事物還有Service Object。TransactionProxyFactoryBean 還有個setter. 這會被Business service object(UserManager)引用, UserManager定義了業務層,並且它還有個屬性,由setUserDAO()引用。

DataSource->SessionFactory->HibernateTemplate->HibernateDaoSupport

    系統持久層中所有的類都繼承自Spring提供的HibernateDaoSupport類,HibernateSupport實現了HibernateTemplate和SessionFactory例項的關聯。HibernateTemplate對Hibernate Session操作進行了封裝,提供了一個簡單的方式實現了Hibernate-based DAO物件。藉助HibernateTemplate我們可以脫離每次資料操作必須首先獲得Session例項、啟動事務、提交/回滾事務以及煩雜的try/catch/finally的繁瑣操作。一個簡單的Hibernate訪問方法就完全解決了些麻煩! 無論是在多個DAO介面還是在多方事務的情況下,Spring使得多種DAO物件無縫地協同工作。

Spring為Hibernate的DAO提供工具類:HibernateDaoSupport。該類主要提供如下兩個方法,方便DAO的實現:

      public final HibernateTemplate getHibernateTemplate()

      public final void setSessionFactory(SessionFactory sessionFactory)

其中,setSessionFactory方法用來接收Spring的ApplicationContext的依賴注入,可接收配置在Spring的SessionFactory例項,getHibernateTemplate方法則用來根據剛才的SessionFactory產生Session,最後生成HibernateTemplate來完成資料庫訪問。


    對於簡單的單步的動作,象find, load, saveOrUpdate或者delete的呼叫,HibernateTemplate提供更為便利的選擇以代替象一行的回撥的執行。此外HibernateDaoSupport類提供了setSessionFactory方法來接受一個SessionFactory,同時提供了getSessionFactory和getHibernateTemplate方法供其繼承類使用。將這些結合起來,允許對於典型的需求給出了非常簡單的DAO實現,如獲得所有使用者的方法:
    public List getUsers(User user) {
        return getHibernateTemplate().find("from User u order by upper(u.username)");
    }

 HibernateTemplate:public void saveUser(Person person){
 4
 5              getHibernateTemplate().saveOrUpdate(person);
 6
 7         }

採用事物配置,我們就不需要寫那麼多的try catch和finally了,因為容器會自動幫我們在執行方法前給我們加上。

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory">
       <ref bean="sessionFactory"/>
    </property>
</bean>


也可以:
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
       <ref bean="sessionFactory"/>
    </property>
</bean>

兩種實現方式其實沒有區別,尤其是第二種不要自己去關閉session,session在事務結束後都會自動關閉。 但是一定要注意延遲載入的問題,當物件在session關閉前沒有從資料庫中取得,而jsp中需要展示物件時,會提示LazyInitializationException,你可以通過OpenSessionInViewFilter來保證延遲載入不會出現錯誤,即:
<filter>
     <filter-name>opensession</filter-name>
     <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>

相關推薦

SpringHibernate操作持久HibernateTemplateHibernateTransactionManager

Spring對Hibernate有很好的支援    DataSource ->SessionFactory-> HibernateTranscationManagerHibernate中通過SessionFactory建立和維護Ses

Spring Boot 入門之持久篇(三)

imp 配置文件 bat catch map ann 文件 save values 原文地址:Spring Boot 入門之持久層篇(三) 博客地址:http://www.extlight.com 一、前言 上一篇《Spring Boot 入門之 Web 篇(二)》介紹

spring boot整合雙持久框架jpa、mybatis

分享 註意 準備 emp star lease 框架 ins 復雜   公司之前用的是spring boot + jpa,但由於jpa無法完美的解決某些動態查詢問題,就使用的jdbcTemplate 動態封裝SQL,由於代碼相對復雜,可讀性差,現準備再引入mybatis。下

SSH(spring springMVC +Hibernate)操作的詳細步驟

    1匯入包(可以在官網下載 可以私聊我給你)   2.編寫SpringMVC.xml    3.編寫web.xml   4.建立jsp跳轉到後臺的類 (跳轉成功實現了spring+springMVC)   建立

Spring Boot 學習之持久篇(三)

該系列並非完全原創,官方文件、作者一、前言上一篇《Spring Boot 入門之 Web 篇(二)》介紹了 Spring Boot 的 Web 開發相關的內容,專案的開發離不開資料,因此本篇開始介紹持久層相關的知識。二、整合 JdbcTemplate1、新增依賴在pom.xm

Spring實現統一捕獲介面異常郵件警報

Java中提供的try{}catch{}finally{}來進行異常捕獲,然後當系統業務複雜,程式碼量則多,為了排除系統錯誤,我們一般在介面層進行異常捕獲,捕獲到異常時列印日誌,通過日誌的方式來排除錯誤。系統越複雜,介面數量越多,如果我們對所有介面都try{}c

Hibernate持久框架使用【八】效能優化快取

一級快取: 在hibernate中一級快取是預設開啟的,它與session相關,例如當你對資料庫中的資料進行查詢後,它會將查詢到的物件儲存到記憶體中,再次查詢時便直接從記憶體中讀取,從記憶體中讀取的速度顯然比從資料庫中讀取資料要快得多。 為了證明,可以寫一個測試類對快取進行測試 publ

Hibernate持久框架使用【三】資料查詢刪除

Hibernate資料查詢可以通過hibernate封裝好的兩個方法來實現 分別是get方法和load方法,這兩個方法都是通過主鍵來查詢資料 get方法: 新建個get.class類來測試一下,下面貼上程式碼 public class get { public static vo

Hibernate持久框架使用【二】資料新增修改

Hibernate的資料新增與修改 新增資料: hibernate提供了這幾種新增資料的方法,分別是: save方法、saveOrUpdate方法、merge方法以及persist方法 在對資料庫進行操作時,過程是先開啟事務—操作資料庫—提交事務 上一篇部落格寫的hibernat

MyBatisHibernate持久框架簡單總結

目錄 資料持久化操作框架及ORM關係 MyBatis框架         MyBatis主要的類 Hibernate框架 Hibernate實體類中有三種狀態: 資料持久化操作框架及ORM關係 1.)MyBatis

SSH(六)hibernate持久模板於事務管理

property ted 保存 actor brush work session name cti   持久層只要完成數據對數據庫增刪改查的操作,我們常說的hibernate區別於mybatis是在於他的全自動,而hibernate的全自動則主要體現於 他的模板,一些簡單的

Hibernate: 數據持久框架

jpg 新手 開源 集成 資源 5.0 領域模型 ads 源地址 Hibernate 是一種Java語言下的對象關系映射解決方案。 它是使用GNU寬通用公共許可證發行的自由、開源的軟件。它為面向對象的領域模型到傳統的關系型數據庫的映射,提供了一個使用方便的框架。Hibern

Spring框架中的aop操作 及aspectjweaver.jaraopalliance-1.0.jar下載地址 包含beans 註解context 和aop的約束

包括 aspect component cts base aid 核心 lease express (aspect oriented programming面向切面編程) 首先在原有的jar包: 需Spring壓縮包中的四個核心JAR包 beans 、contex

三、持久框架(Hibernate

true 技術分享 mysql 分享圖片 pac transacti cat tid localhost 一、Hibernate處理關系 關系主要有三種:1、多對一  2、一對多  3、多對多 1、多對一 一個Product對應一個Category,一個Category對應

hibernate的中的查詢級聯操作

導致 pan 出了 場景 效果 自動保存 情況下 主鍵 只需要 1.Criteria查詢接口適用於組合多個限制條件來搜索一個查詢集。 要使用Criteria,需要遵循以下步驟: *創建查詢接口: Criteria criteria=session.createCrite

Java基於jdbctemplate資料持久操作封裝

相關資源分享-下載可直接使用: https://download.csdn.net/download/csdn_heliu/10736181 JdbcTemplate簡介: spring對資料庫的操作在jdbc上面做了深層次的封裝,使用spring的注入功能,可以把DataSour

Hibernate持久框架使用【七】SQL語句

除了上篇部落格介紹的HQL語句外,還可以使用SQL語句來進行資料的查詢。 具體如何使用這裡直接貼程式碼了: 首先建一個Sql.class類來測試一下 public class Sql { public static void main(String[] args) { // TO

Hibernate持久框架使用【六】HQL語句

  除了前面直接呼叫的get等方法查詢資料外,還可以通過編寫HQL語句來更加靈活的查詢資料 例如在資料庫中有一張student表,其中有兩條資料,如下圖 下面使用HQL語句來查詢表中的資料 示例程式碼: student表: @Entity(name="stud

Hibernate持久框架使用【五】hibernate表關聯

Hibernate配置表關聯的方式 一對一(OneToOne) 例如在一張表中,其中有一個列與另一個表對應,並且是唯一對應的關係時就是一對一關係了,通常我們會將這一列作為外來鍵(資料庫基礎知識),例如新建兩張表,一張company表作為公司表,一張Boss表作為老闆表,因此這裡就是一個公司對

Hibernate持久框架使用【四】hibernate的常用註解

@DynamicInsert註解 這是一個hibernate對類的註解,用於資料的動態插入,對於持久化類中的屬性是否被賦值來動態生成sql語句 例如下面使用該註解來註解User類 @Entity(name="tb_user") @DynamicInsert(false) public c