0

コードで例外が発生したときのロールバックをサポートしたいと考えています。

テスト用にSpring構成ファイルでjunit +データソースを使用し、実際のコードにはGlassfish 2.1を使用します(jndiデータソースを使用)。

ここにコードのサンプルがあります。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:test-web-spring-config.xml" })
public class PersistTest {

    @Autowired
    Transformer transformer;

    @Before
    public void setUp() throws Exception {

    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    @Transactional("transactionManagerTest")
    //@Rollback(false)
    // @Ignore
    public void test() {

        transformer.export();

    }

}

@Component
public class Transformer {

    @Autowired
    ContextPersist context;

    @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
    public void export(){
        //code here
        // persist here
        context.persist();
        // to test a rollback
        throw new RuntimeException("testing rollback2");

    }

}

@Component
public class ContextPersist {

    @Autowired
    @Qualifier(value = "dataSource")
    DataSource dataSource;

    // bulk insert
    JdbcTemplate jdbcTemplate;

    @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
    public void persist() {
        jdbcTemplate = new JdbcTemplate(dataSource);

        //.. here I insert data with jdbcTemplate.batchUpdate(....)

        // to test a rollback
        throw new RuntimeException("testing rollback1");
    }
}

そのコードはロールバックしません。

Junit で @Rollback(true) を使用すると、トランザクションはロールバックされます。しかし、JUnit の外でも同じ動作が必要です。

EDITED : (春の設定を追加)

私のプロジェクトには、webapp (demo.war) と DAO+businessrules の jar が含まれています

私の webapp には、トランスフォーマーがあります。

この Web アプリケーションには親の Spring 構成があり、他の Web アプリケーションと共有される共通の Spring 構成があります。

ここにファイルがあります。

デモ.戦争

web-spring-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
         http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">

    <context:component-scan base-package="com.test" />
    <tx:annotation-driven />
    <task:annotation-driven/>

    <import resource="classpath:common-spring-config.xml" />

</beans>

DAO.jar

common-spring-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
        http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">

    <context:component-scan base-package="com.test" />
    <tx:annotation-driven />
    <task:annotation-driven/>

    <!-- Hibernate -->
    <bean id="hibernateSessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="demo.datasource" />
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
        <property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration</value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            </props>
        </property>
    </bean>

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

    <!-- datasource -->
    <bean id="demo.datasource" class="org.springframework.jndi.JndiObjectFactoryBean"
        lazy-init="true">
        <property name="jndiName" value="jdbc/demo" />
    </bean>

</beans>
4

1 に答える 1

0

あなたのトランザクションマネージャーは

org.springframework.orm.hibernate3.HibernateTransactionManager

しかし、あなたは使用しますJdbcTemplate

AOP は、休止状態操作で自動開始/コミット/ロールバックするように構成されています。jdbcTemplate はどのトランザクションにも参加しません。トランザクションなし = ロールバックなし。connection.setAutoCommit(true); のようなものです。

于 2013-11-13T10:38:13.600 に答える