2013-05-14 2 views
4

JPA EntityManager를 사용하여 엔티티를 가져오고 업데이트하는 DAO를 테스트하려고합니다. 내 단위 테스트를 Transactional로 표시하고 defaultRollback 속성을 false로 설정했습니다. 그러나 룬 시간 예외를 throw 할 때 테스트가 끝날 때 트랜잭션이 롤백되지 않습니다. 데이터가 DB에 유지됩니다. 다음은 스프링 구성과 함께 단위 테스트 코드입니다. 분명히 뭔가 빠져 있지만 havent는 무엇을 확인할 수있었습니다. 는, BTW 거래는Spring JUnit JPA 트랜잭션이 롤백되지 않습니다.

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

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="${jpa.persistenceunitname}"/> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter"> 
      <property name="databasePlatform" value="org.apache.openjpa.jdbc.sql.DBDictionary"/> 
     </bean> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 
+0

트랜잭션이 롤백되지 않았 음을 어떻게 확인 했습니까? 데이터베이스가 값을 업데이트 했습니까? 어떤 데이터베이스를 사용하고 있습니까? mysql을 사용하는 경우 어떤 스토리지 엔진입니까? – gkamal

+0

예, SQL Server 2008을 사용하고 데이터베이스에 값이 업데이트되었습니다. Btw, 내 JPA 공급자는 IBM Websphere Thin 클라이언트입니다 – user320587

+0

TransactionalTestExecutionListener.class에 의해 트랜잭션을 롤백하지 않은 문제가있었습니다. 감사합니다 !!!! – avalon

답변

1

귀하의 구성이 잘 보인다 persistence.xml을

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:spring/test-jpa.xml"}) 
@TestExecutionListeners(
{ DependencyInjectionTestExecutionListener.class, 
TransactionalTestExecutionListener.class, 
DbUnitTestExecutionListener.class 
}) 
@TransactionConfiguration(defaultRollback=false) 
@Transactional 
public class JpaTests { 
    @PersistenceContext 
    EntityManage em; 

    @Test 
    public void testTransactionQueueManager() { 
     Object entity = em.find(1); 
     //code to update entity omitted. 
    entity = em.merge(entity); 
    em.flush(); 
     throw new RuntimeException 
    } 
} 

봄 구성에 RESOURCE_LOCAL입니다. 예기치 않은 커밋에 대한 다른 이유가있을 수 있습니다. 자동 커밋 모드를 사용하는 데이터 소스 또는 비 트랜잭션 호환 데이터베이스 (MyISAM을 사용하는 MySQL)

이 스레드를 확인하십시오 Why are transactions not rolling back when using SpringJUnit4ClassRunner/MySQL/Spring/Hibernate?

+0

또는이 하나 : http://stackoverflow.com/questions/3128111/spring-jta-jpa-dao-integration-test-doesnt-rollback? – Gab

0

@TransactionConfiguration (defaultRollback = false)

이 원인 일 수 있습니다. 트랜잭션을 롤백해야하는 defaultRollback = true를 시도하십시오.

+0

기본적으로 켜져 있습니다. – kboom

0

rollbackFor을 추가하는 것은 일반적인 함정입니다.

관련 문제