2012-03-12 2 views
1

Spring을 사용하여 JUnit 테스트에서 SQL 스크립트를 실행하려고합니다. 스크립트는 테스트 용 데이터를 설정하는 데 사용됩니다. 그러나 스크립트가 실행될 때 스크립트의 INSERT는 각 테스트 후에 커밋됩니다. 스프링 문서에서는 DDL로 롤백 할 것을 기대하지 않지만 내 스크립트의 모든 내용은 DML입니다. 포함 된 것은 INSERT 문과 마지막 삽입 ID (SET @blah = LAST_INSERT_ID())입니다.스프링 테스트를 사용하여 SQL 스크립트를 실행하면 변경 내용이 커밋됩니다.

구성이 잘못 되었나요? 나는 이것을 MySQL 데이터베이스에 사용하고있다. 우리의 구성은 다음과 같습니다 :

다음은 몇 가지 연구를 기반으로하고 있습니다. executeSqlScript에 대한 첫 번째 호출은 별도의 트랜잭션에서 실행됩니다. Spring의 SimpleJdbcTemplate.update 메소드는 executeSqlScript에 의해 호출된다. 이것은 연결 풀에서 가져온 JDBC 연결 범위이므로 DB에 대한 후속 액세스에서 동일한 연결을 보장하지 않으므로 동일한 트랜잭션에서 실행되도록 보장 할 수 없습니다.

TransactionManager 나 (Hibernate Session Factory)를 통해 모든 DB 작업을 수행한다면 내부 트랜잭션이 트랜잭션을 범위 지정하는 방식 때문에 작동합니다. SimpleJdbcTemplate.update 나는 동일한 트랜잭션에서 테스트하고있어 이후 실제 코드를 실행하는 방법

  1. 그림 아웃 : 여기 내 옵션에 있습니다. 나는 내가 이것을 할 수 있다고 생각하지만, 지금까지는 내 노력이 효과가 없었다.

  2. 모든 테스트 데이터가 SessionFactory를 통해 설정 되었습니까? 따라서 JDBC를 통해 직접 SQL 스크립트를 실행하는 대신 모델 객체를 채우고 최대 절전 모드 DAO를 통해이를 유지할 수 있습니다.

여기 올바른 길에 있습니까? 누구든지 더 이상의 지침을 제공 할 수 있습니까?

+0

데이터 소스 설정은 보일 다음 장소입니다 – sw1nn

답변

0

다음 'jpaVendorAdapter'를 내 entityManagerFactory 선언에 추가하여이 문제를 해결할 수있었습니다.

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
    <property name="dataSource" ref="dataSource"/> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
     </property> 
</bean> 
1

아마도 db 연결에서 자동 커밋이 활성화되어있을 것입니다.

<bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${jdbc.driverClassName}"/> 
    <property name="url" value="${jdbc.url}"/> 
    <property name="username" value="${jdbc.username}"/> 
    <property name="password" value="${jdbc.password}"/> 
    <property name="defaultAutoCommit" value="false"/> 
</bean> 

또한이 인수는 jdbc url에 전달할 수도 있습니다.

+0

위의 편집 내용을 참조하십시오. auto-commit = false로 설정하면 실제로 SQL 스크립트를 실행할 때 3이 삽입되는 경우에도 testLoadOrders 메소드가 DB에서 0 행을 보게됩니다. 이것은 둘 다 별도의 트랜잭션으로 실행되고 있음을 나타냅니다. – sma