2011-11-15 3 views
2

DBUnit을 사용하여 공간 데이터를 Oracle 데이터베이스에 삽입 한 다음 롤백하려고합니다. 공간 데이터를 삽입하려면 공간 데이터 유형에 대한 다른 DBUnit Oracle 확장을 가져 오는 Oracle10DataTypeFactory를 사용해야합니다. 내부적으로 OraclePreparedStatement에 캐스트를 수행합니다. OraclePreparedStatement를 얻으려면 OracleDataSource를 사용합니다. 그래서 다음의 Spring 설정을 사용할 때 :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를 사용하여 똑같은 테스트를 수행하십시오. 잊어 버리십시오. 아무 것도 롤백되지 않습니다. autocommit이 true로 설정되어있는 것을 보았습니다.하지만 불행히도 Oracle은 OracelDataSource 설정 방법을 제공하지 않습니다. 적어도 하나는 찾을 수 없습니다. 그래서 내 테스트 설정에서 나는 다음과 같이 false로 명시 적으로 설정했다.

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

심지어 무시된다. 비슷한 상황에 처한 사람이 있습니까?

답변

0

스프링 롤백은 트랜잭션이 시작된 경우에만 올바르게 작동합니다.

따라서 테스트에 스프링 러너 (예 : @RunWith(SpringJUnit4ClassRunner.class) 테스트 주석 달기)를 사용하고 @Transactional에 의해 주석이 첨부 된 테스트를 사용해야합니다.

관련 문제