简体   繁体   中英

Transaction management doesn't appear to work on Spring Tests

I expect the data to be written to the database after the method with @Transactional is completed. Is this a valid assumption for my JUnit test when using a HSQL database. I am using HSQL db for development and Oracle for my deployed application. Web App deployed on WebSphere, developed in RSA. Below is a summary of my configuration, including POM and junit test:

POM:
3.2.9.RELEASE
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.3</version>

<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.1</version>

APPLICATION CONTEXT:
<!-- the bean for transaction manager for scoping/controlling the transactions -->
<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dbDataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />

<jee:jndi-lookup id="dbDataSource" jndi-name="jndi/HSQLDatasource" expected-type="javax.sql.DataSource" />

<!--Mapper-->
<bean id="campaignMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface"
        value="com.abc.persistence.mapper.CampaignMapper" />
    <property name="sqlSessionTemplate">
        <bean class="org.mybatis.spring.SqlSessionTemplate">
            <constructor-arg index="0" ref="sqlSessionFactoryForBatch" />
            <constructor-arg index="1" value="BATCH" />
        </bean>
    </property>     
</bean>

<!-- SqlSessionFactory For Batch -->
<bean id="sqlSessionFactoryForBatch" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dbDataSource" />
    <property name="typeAliasesPackage" value="com.abc" />
    <property name="mapperLocations" value="classpath*:com/mybatis/mappers/**/*.xml" />
</bean>

JUNIT:
//junit class extends a base class that initializes HSQL db
//jdbcConnection.setAutoCommit(false);

    @Autowired
    CampaignMapper campaignMapper;

    @Transactional
    @Test 
    public void testInsert(){

        for(Campaign record:campaignsFromFile){
            record.setRowLastUpdateId(rowLastUpdateId);
            record.setCampaignId(campaignId);
            campaignMapper.insertCampaignRecord(record);
        }
        //At this point I expect that the data would NOT be written to the database
        //other method code

        }//end of method
        //At this point I expect that the data would be written to the database

By default, Spring will rollback the transaction in test contexts. If this is not the behavior you expect, you always can use @Rollback annotation with false value:

@Transactional
@Test 
@Rollback(false)
public void testInsert() { ... }

If by any chance you're using Spring 4.2.x release, you can use the new @Commit annotation which is a new annotation that may be used as a direct replacement for @Rollback(false) . You can read more about Transaction Management in Spring Test Context here .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM