類:
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ù)對象HibernateCustomerDAO,它包裹了Hibernate SessionFactory。注意,默認(rèn)時,Spring中定義的JavaBean都是單例的,HibernateCustomerDAO也不例外。這意味:多個線程可能同時執(zhí)行createCustomer()方法。
其次,配置了Hibernate事務(wù)管理器,它包裹了同一Hibernate SessionFactory實例。在事務(wù)管理器每次執(zhí)行時,它都會完成如下幾件事情。其一,檢查Hibernate Session是否綁定到當(dāng)前線程。如果已綁定,則直接使用它。如果還未綁定,事務(wù)管理器將告知Hibernate SessionFactory創(chuàng)建新的Session,然后將創(chuàng)建的Session綁定到當(dāng)前線程。其二,如果當(dāng)前沒有處于活動的事務(wù),則事務(wù)管理器將啟動新的事務(wù),并將Session包裹進(jìn)來。否則,直接參與到活動事務(wù)中。
整個過程是通過使用Spring提供的TransactionProxyFactoryBean實現(xiàn)的。當(dāng)然,這是一種以聲明方式實現(xiàn)的事務(wù)管理過程。 TransactionProxyFactoryBean能夠為業(yè)務(wù)對象創(chuàng)建代理對象,從而通過事務(wù)管理器管理事務(wù)。當(dāng)每次通過代理對象調(diào)用createCustomer()方法時,事務(wù)管理器將根據(jù)事務(wù)屬性管理事務(wù)。當(dāng)前,Spring除了提供HibernateTransactionManager事務(wù)管理器外,還為JDBC數(shù)據(jù)源、JDO、TopLink提供了相應(yīng)的事務(wù)管理器。
再來看看業(yè)務(wù)對象吧!當(dāng)調(diào)用createCustomer()方法時,HibernateTemplate將查找綁定到當(dāng)前線程的Hibernate Session。由于上述配置文件片斷傳入到HibernateTemplate構(gòu)建器的第二個參數(shù)為false,因此如果沒有綁定Hibernate Session,則將拋出未受查異常。這對于那些未正確配置事務(wù)管理功能的場和特別有用(注意,事務(wù)管理器很重要)。一旦事務(wù)管理配置好后,Hibernate Session將綁定到當(dāng)前線程,從而啟動事務(wù)。請注意,HibernateTemplate不會去檢查事務(wù)是否激活,也不會顯示地啟動或終止事務(wù)。也請注意,如果在聲明的方法(事務(wù)屬性中給出的)中拋出了未受查異常,則當(dāng)前活動事務(wù)將回滾。
posted on 2006-06-19 15:31
Dragonofson 閱讀(1356)
評論(0) 編輯 收藏 所屬分類:
Spring