隨筆-13  評(píng)論-9  文章-9  trackbacks-0
          類:
          public interface CustomerDAO {
          public void createCustomer(Customer customer);
          }

          public class HibernateCustomerDAO implements CustomerDAO {

          private HibernateTemplate hibernateTemplate = null;

          public void setSessionFactory(SessionFactory sessionFactory) {
          this.hibernateTemplate = new HibernateTemplate(sessionFactory, false);
          }

          public void createCustomer(Customer customer) {
          this.hibernateTemplate.save(customer);
          }
          }
          配置文件:
          <bean id="customerDAOTarget" class="test.usecase.HibernateCustomerDAO">
           <property name="sessionFactory"><ref bean="sessionFactory"/></property>
          </bean>

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

          <bean id="customerDAO" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
           <property name="transactionManager"><ref bean="transactionManager"/></property>
           <property name="target"><ref bean="customerDAOTarget"/></property>
           <property name="transactionAttributes">
            <props>
             <prop key="create*">PROPAGATION_REQUIRED</prop>
             <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
           </property>
          </bean>
          上述Spring配置片斷定義了業(yè)務(wù)對(duì)象HibernateCustomerDAO,它包裹了Hibernate SessionFactory。注意,默認(rèn)時(shí),Spring中定義的JavaBean都是單例的,HibernateCustomerDAO也不例外。這意味:多個(gè)線程可能同時(shí)執(zhí)行createCustomer()方法。

            其次,配置了Hibernate事務(wù)管理器,它包裹了同一Hibernate SessionFactory實(shí)例。在事務(wù)管理器每次執(zhí)行時(shí),它都會(huì)完成如下幾件事情。其一,檢查Hibernate Session是否綁定到當(dāng)前線程。如果已綁定,則直接使用它。如果還未綁定,事務(wù)管理器將告知Hibernate SessionFactory創(chuàng)建新的Session,然后將創(chuàng)建的Session綁定到當(dāng)前線程。其二,如果當(dāng)前沒有處于活動(dòng)的事務(wù),則事務(wù)管理器將啟動(dòng)新的事務(wù),并將Session包裹進(jìn)來(lái)。否則,直接參與到活動(dòng)事務(wù)中。

            整個(gè)過程是通過使用Spring提供的TransactionProxyFactoryBean實(shí)現(xiàn)的。當(dāng)然,這是一種以聲明方式實(shí)現(xiàn)的事務(wù)管理過程。 TransactionProxyFactoryBean能夠?yàn)闃I(yè)務(wù)對(duì)象創(chuàng)建代理對(duì)象,從而通過事務(wù)管理器管理事務(wù)。當(dāng)每次通過代理對(duì)象調(diào)用createCustomer()方法時(shí),事務(wù)管理器將根據(jù)事務(wù)屬性管理事務(wù)。當(dāng)前,Spring除了提供HibernateTransactionManager事務(wù)管理器外,還為JDBC數(shù)據(jù)源、JDO、TopLink提供了相應(yīng)的事務(wù)管理器。

            再來(lái)看看業(yè)務(wù)對(duì)象吧!當(dāng)調(diào)用createCustomer()方法時(shí),HibernateTemplate將查找綁定到當(dāng)前線程的Hibernate Session。由于上述配置文件片斷傳入到HibernateTemplate構(gòu)建器的第二個(gè)參數(shù)為false,因此如果沒有綁定Hibernate Session,則將拋出未受查異常。這對(duì)于那些未正確配置事務(wù)管理功能的場(chǎng)和特別有用(注意,事務(wù)管理器很重要)。一旦事務(wù)管理配置好后,Hibernate Session將綁定到當(dāng)前線程,從而啟動(dòng)事務(wù)。請(qǐng)注意,HibernateTemplate不會(huì)去檢查事務(wù)是否激活,也不會(huì)顯示地啟動(dòng)或終止事務(wù)。也請(qǐng)注意,如果在聲明的方法(事務(wù)屬性中給出的)中拋出了未受查異常,則當(dāng)前活動(dòng)事務(wù)將回滾。

          posted on 2006-06-19 15:31 Dragonofson 閱讀(1365) 評(píng)論(0)  編輯  收藏 所屬分類: Spring

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 大竹县| 沾化县| 南岸区| 民勤县| 奎屯市| 科尔| 双辽市| 湘西| 鸡东县| 凯里市| 怀仁县| 宜城市| 丹江口市| 汉中市| 桓仁| 鲁甸县| 安仁县| 巩义市| 罗源县| 长子县| 西畴县| 云安县| 温州市| 平谷区| 监利县| 兴隆县| 怀集县| 博野县| 邵阳市| 道真| 漠河县| 开平市| 武功县| 齐齐哈尔市| 庐江县| 资源县| 宜章县| 陆河县| 万盛区| 郁南县| 郓城县|