5

トランザクションでの例外処理に疑問があります。私の問題を明確に述べるために、私の構成を示したいと思います。

<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ブロックでキャッチされませんでした。むしろ、addNewCustomerメソッドを呼び出したマネージドBeanからその例外をキャッチできます。

4

2 に答える 2

8

これはSpringのドキュメントからの抜粋です

デフォルトの構成では、Spring Frameworkのトランザクションインフラストラクチャコードは、実行時のチェックされていない例外の場合にのみ、トランザクションにロールバックのマークを付けます。つまり、スローされた例外がRuntimeExceptionのインスタンスまたはサブクラスである場合です。(エラーは、デフォルトではロールバックも発生します)。トランザクションメソッドからスローされるチェックされた例外は、デフォルト構成でロールバックされません。

rollbackFor = Throwable.classを設定すると、Springは例外/エラーに対してロールバックします。デフォルトでは、好むと好まざるとにかかわらず、SpringはRuintimeExceptionに対してのみロールバックし、それ以外の場合はコミットします。

于 2012-12-14T18:26:55.777 に答える
6

SpringフレームワークはRuntimeExceptionsのみをスローします。技術的には、例外をキャッチする必要はありません。

于 2012-12-14T18:03:31.323 に答える