2011-06-21 91 views
3

我一直在閱讀關於使用Spring和Hibernate的知識,我對會話管理非常困惑。希望有人能爲我清除一些東西,Spring + Hibernate會話管理

首先,我不知道如何使用HibernateTemplate管理會話。當你調用一個方法時會打開和關閉一個會話,例如模板上的Save()?當你使用find()方法時,被分離的對象返回了嗎?

我已閱讀關於事務的Spring部分,但它主要討論處理異常。我希望找到某種將hibernate會話綁定到Spring事務的方法,以便在事務結束時提交對hibernate對象的更改。有沒有辦法做到這一點?

回答

2

Spring爲您管理會話。展望在documentation,特別是在第13.3.1節,你看

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="myDataSource"/> 
    <property name="mappingResources"> 
     <list> 
     <value>product.hbm.xml</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <value> 
     hibernate.dialect=org.hibernate.dialect.HSQLDialect 
     </value> 
    </property> 
    </bean> 

,然後在第13.3.3你看這

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

如果你仔細看,你會看到會話工廠使用數據源,事務管理器使用sessionfactory,這樣Spring可以爲你提供會話,並將所有持久代碼包裝在一個事務中。

+0

對於實際發生的事情不太清楚。如果這個事務管理器用於特定的方法,這是否意味着該方法內的所有數據庫訪問都將發生在同一個hibernate會話中?如果我在這個方法中加載一個hibernate對象,當方法結束時,它會被更改爲提交嗎? – toc777

+0

@toc事務管理器總是被使用。根據你如何指定要保護的方法,它會做不同的事情。會話在關閉之前自動刷新; hibernate管理,而不是Spring。你應該看看opensessioninview過濾器。 – hvgotcodes

+0

@toc,如果你想知道它是如何工作的,我會建議你下載源代碼,然後使用你的調試器遍歷你的代碼。 – hvgotcodes