0
@Transactional
のメソッドが完了した後に、データがデータベースに書き込まれることが期待されます。これは、HSQLデータベースを使用しているときの私のJUnitテストの正当な前提ですか?開発用にはHSQL DBを、配備済みアプリケーションにはOracleを使用しています。 RSAで開発されたWebSphereにデプロイされたWebアプリケーション。 は以下POMとJUnitテストを含め、私の設定の要約です:デフォルトではトランザクション管理がSpringテストで動作しないようです
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
私の予想は、メソッドが終了するまでレコードをデータベースに書き込まないようにすることです。しかし、私はデバッグで実行する場合は、挿入後にブレークポイントを入れ、(ループ内の)挿入ごとにデータベースを照会すると、データベースに書き込まれた個々のレコードが1つずつ表示されます。私の期待は、メソッドが完了した後にのみ記述されるべきだということです。 @Rollbackに関する洞察をいただきありがとうございます。私はこの他の問題を最初に修正した後に知っておくと便利です。 – jimmy
その後、 'Transactional'と' Rollback'を削除し、 'TestTransaction'抽象化を使ってトランザクションを手動で管理します。 'start'、' end'、 'flagForCommit'メソッドを使うことができます。 –
申し訳ありませんが、今は混乱しています。だから私はこのコメントを正しく読めば私はそれを使用しようとしている私のコードをテストすることはできません。私はトランザクションを使用することはできません。私はそれをTestTranactionに置き換える必要があります。私はこれがjunitテストでのTransactional用の直接的な置換アノテーションだと思っていましたが、そうは思われません。私はTestTranactionの助けを捜したが、役に立たなかった。それが全く異なる場合は、開発環境での動作を調べることができない場合、どのように展開すれば自分のコードに自信を持てるか分かりません。 – jimmy