2011-11-15 5 views
2

DBUnitを使用してOracleデータベースに空間データを挿入し、ロールバックしようとしています。空間データを挿入するには、他のDBUnit Oracle拡張で空間データ型を取得するOracle10DataTypeFactoryを使用する必要があります。内部的には、OraclePreparedStatementへのキャストを行います。 OraclePreparedStatementを取得するには、OracleDataSourceを使用します。だから私は次のスプリング設定を使用するとき:OracleDataSource使用時にDBUnit/Springトランザクションがロールバックされない

<bean id="testDataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close"> 
    <property name="URL" value="${database.url}"/> 
    <property name="user" value="${user}"/> 
    <property name="password" value="${password}"/> 
    <property name="implicitCachingEnabled" value="false" /> 
    <property name="explicitCachingEnabled" value="false" /> 
    <property name="connectionCachingEnabled" value="false" /> 
</bean> 

インサートはロールバックされません。私はそれが次のテストのOracleDataSourceに関連付けられていることを知っています。空間データを必要としないテーブルに行を挿入します。次の構成を使用してください。

<bean id="testDataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> 
    <property name="url" value="${database.url}"/> 
    <property name="username" value="${user}/> 
    <property name="password" value="${password}"/> 
</bean> 

すべてが正常に動作し、テスト完了時にインサートがロールバックされます。前述のOracleDataSourceを使用して同じ正確なテストを実行し、忘れてください。何もロールバックされません。自動コミットがtrueに設定されているのを見てきましたが、残念ながらOracleはOracelDataSourceの設定方法を提供していません。私のテスト設定では、次のように明示的にfalseに設定しました。

connection = DataSourceUtils.getConnection(dataSource); 
connection.setAutoCommit(false); 

でも、それは無視されるようです。誰かが似たような状況に遭遇しましたか?

答えて

0

スプリングロールバックは、トランザクションが開始されている場合にのみ正しく機能します。

テストでは、スプリングランナー(例:@RunWith(SpringJUnit4ClassRunner.class)でテストに注釈を付ける)と@Transactionalで注釈を付けたテストが使用されていることを確認してください。

関連する問題