2012-12-14 61 views
4

我对使用事务处理异常有疑问。为了表述清楚我的问题,我想表明我的配置:Spring Transaction中需要异常处理吗?

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

<tx:annotation-driven transaction-manager="transactionManager" /> 

<bean id="transactionInterceptor" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
    <property name="transactionManager" ref="transactionManager" /> 
    <property name="transactionAttributeSource"> 
     <bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource" /> 
    </property> 
</bean> 

<bean id="baseService" abstract="true"> 
    <property name="daoProvider" ref="daoProvider" /> 
</bean> 

<bean id="customerService" parent="transactionInterceptor"> 
    <property name="target"> 
     <bean class="com.edfx.adb.service.CustomerService" parent="baseService" /> 
    </property> 
</bean> 

<bean id="daoProvider" class="com.edfx.adb.dao.provider.DaoProvider"> 
    <property name="customerDao" ref="customerDao" /> 
</bean> 

<bean id="customerDao" class="com.edfx.adb.dao.CustomerDao"> 
    <constructor-arg value="#{T(com.edfx.adb.persist.entity.Customer)}" /> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

活动事务类是:

@Transactional 
public class CustomerService extends BaseService implements ICustomerService { 

    @Transactional(readOnly = true) 
    public Customer getCustomerById(String id) { 
     return getDaoProvider().getCustomerDao().getCustomerById(id); 
    } 

    @Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = { Throwable.class }) 
    public void addNewCustomer(CustomerDTO customerDTO) { 
     Customer customer = new Customer(); 

     customer.setCustomerId(customerDTO.getCustomerId()); 
     customer.setCustomerName(customerDTO.getCustomerName()); 
     customer.setActive(customerDTO.isActive()); 

     getDaoProvider().getCustomerDao().save(customer); 
    } 
} 

我的疑惑在于方法addNewCustomer。我已经设置了rollbackFor = { Throwable.class }

它是如何工作的?

还做我需要明确地处理异常,如:

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = { Throwable.class }) 
public boolean addNewCustomer(CustomerDTO customerDTO) { 
    Customer customer = new Customer(); 

    customer.setCustomerId(customerDTO.getCustomerId()); 
    customer.setCustomerName(customerDTO.getCustomerName()); 
    customer.setActive(customerDTO.isActive()); 

    try { 
     getDaoProvider().getCustomerDao().save(customer); 
    } catch (Throwable throwable) { 
     return false; 
    } 

    return true; 
} 

强行我已经删除从客户表中的列上创建一个例外,但例外是不是在try-catch块来抓,相反,我可以从托管的bean中调用addNewCustomer方法来捕获该异常。

回答

8

这是春天文档的摘录

在其默认的配置,Spring框架的事务 基础设施代码只在回退功能标记事务运行的 ,未检查异常;也就是说,抛出的异常 是RuntimeException的一个实例或子类。 (错误也会 - 默认为 - 导致回滚)。检查从事务性方法抛出的异常 不会导致在默认 配置中回滚。

您设置了rollbackFor = Throwable.class,现在Spring将回滚任何异常/错误。默认情况下,无论我们喜欢与否,Spring将仅针对RuintimeException进行回滚,否则将提交

+0

强制我创建了一个异常,从客户表中删除一列,但是这个异常没有在try-catch块中被捕获,而是我可以从托管bean中捕获那个我调用了'addNewCustomer'方法的异常。 –

+1

实际上,在具体的情况下,rollbackFor = Throwable.class是没有意义的,因为addNewCustomer不能抛出任何checked异常,因为它没有声明任何异常,并且RuntimeExceptions被默认捕获。 –

+0

谢谢你的解释。请告诉我,春天的XML配置好吗? –

6

Spring框架只抛出RuntimeExceptions,从技术上讲,你永远不必捕捉任何异常。

+0

谢谢。春天的xml配置是否正常? hibernate的save方法thorws Hibernate异常。我不需要处理它吗? –

+0

发布例外 –

+0

我没有得到任何异常。我正在编写代码,在编写时我很好奇异常处理。我试图让我的代码错误免费。 –