Dashboard > OpenSource Project > ... > Spring > 入門 37 - 對Hibernate的編程事務管理
OpenSource Project Log In   View a printable version of the current page.
入門 37 - 對Hibernate的編程事務管理
Added by cheetah, last edited by cheetah on Apr 05, 2005
Labels: 
(None)

  在使用Spring整合Hibernate時,建議將事務管理交由Spring來負責,同樣的,我們可以使用編程式的事務管理與宣告式的事務管理,方法與之前直接使用JDBC進行事務類似,這邊直接介紹一個簡單的例子。

  這邊使用org.springframework.orm.hibernate.HibernateTransactionManager,它需要注入sessionFactory,我們直接看看bean定義檔的內容:

 代碼:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 
<beans> 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
        <property name="driverClassName"> 
            <value>com.mysql.jdbc.Driver</value> 
        </property> 
        <property name="url"> 
            <value>jdbc:mysql://localhost:3306/TestDB</value> 
        </property> 
        <property name="username"> 
            <value>caterpillar</value> 
        </property> 
        <property name="password"> 
            <value>123456</value> 
        </property> 
    </bean> 
    
    <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean" destroy-method="close"> 
        <property name="dataSource"> 
            <ref bean="dataSource"/> 
        </property> 
        <property name="mappingResources"> 
            <list> 
                <value>User.hbm.xml</value> 
            </list> 
        </property> 
        <property name="hibernateProperties"> 
            <props> 
                <prop key="hibernate.dialect"> 
                    net.sf.hibernate.dialect.MySQLDialect 
                </prop> 
                <prop key="hibernate.show_sql"> 
                    true 
                </prop> 
            </props> 
        </property> 
    </bean> 

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

    <bean id="userDAO" class="onlyfun.caterpillar.UserDAO"> 
        <property name="transactionManager"> 
            <ref bean="transactionManager"/> 
        </property> 
        <property name="sessionFactory"> 
            <ref bean="sessionFactory"/> 
        </property> 
    </bean> 
</beans>

  我們的UserDAO繼承HibernateDaoSupport,這可以省去我們對sessionFactory與hibernateTemplate的處理,UserDAO如下:

 代碼:

UserDAO.java
package onlyfun.caterpillar; 

import org.springframework.orm.hibernate.support.*; 
import org.springframework.transaction.*; 
import org.springframework.transaction.support.*; 

public class UserDAO extends HibernateDaoSupport { 
    private TransactionTemplate transactionTemplate; 
    
    public void setTransactionManager(PlatformTransactionManager transactionManager) { 
        this.transactionTemplate = new TransactionTemplate(transactionManager); 
    } 
    
    public void insertUser(final User user) { 
        transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); 
        transactionTemplate.execute(new TransactionCallbackWithoutResult() { 
                public void doInTransactionWithoutResult(TransactionStatus status) { 
                    getHibernateTemplate().saveOrUpdate(user); 
                    .... 
                } 
            }); 
    } 
}

  同樣的,我們使用TransactionTemplate來封裝事務管理的細節,剩下的就不用多說了,與之前介紹過的事務管理是類似的,您也可以看看參考手冊來看看一些細節說明。

Site powered by a free Open Source Project / Non-profit License (more) of Confluence - the Enterprise wiki.
Learn more or evaluate Confluence for your organisation.
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.1.5a Build:#411 Mar 16, 2006) - Bug/feature request - Contact Administrators