Транзакция DBUnit / Spring не откатывается при использовании OracleDataSource - PullRequest
2 голосов
/ 15 ноября 2011

Я пытаюсь использовать DBUnit, чтобы вставить пространственные данные в базу данных Oracle, а затем откатить их. Чтобы вставить пространственные данные, я должен использовать Oracle10DataTypeFactory, которая использует другие расширения Oracle DBUnit для пространственных типов данных. Внутри они будут выполнять приведение к OraclePreparedStatement. Чтобы получить OraclePreparedStatement, я использую OracleDataSource. Поэтому, когда я использую следующую конфигурацию 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, как показано ранее, забудьте, ничего не откатывается. Я видел, что для autocommit задано значение true, но, к сожалению, Oracle не предоставляет метод для настройки на OracelDataSource, по крайней мере, тот, который я не смог найти. Поэтому в моей тестовой настройке я явно установил значение false со следующим:

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

Но даже это, кажется, игнорируется. Кто-нибудь сталкивался с подобной ситуацией?

1 Ответ

0 голосов
/ 15 ноября 2011

Spring Role Back работает корректно, только если транзакция запущена.

Поэтому убедитесь, что в вашем тесте используется Spring Runner (например, с помощью аннотирования теста с помощью @RunWith(SpringJUnit4ClassRunner.class)), а тест с аннотацией @Transactional.

...