2014-09-18 2 views
4

주석 처리 된 TX Spring 지원을 사용하려고합니다.Spring @ Transaction이 작동하지 않습니다.

응용 프로그램 컨텍스트 XML :

<?xml ...> 

    <tx:annotation-driven/> 

    <bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource"> 
     ... 
    </bean> 

    <bean id="repository" class="Repository"> 
     <constructor-arg ref="dataSource"/> 
    </bean> 
</beans> 

실제 코드 :

public class Repository { 
    @Transactional 
     public void save(Op op) { 
      System.out.println("Transaction active:::: " + TransactionSynchronizationManager.isActualTransactionActive()); 

    ... 
    } 
} 

국가 번호 :

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"/integration-context.xml"}) 
public class RepositoryTest { 
    @Autowired 
    private Repository repository;   

    @Test 
    public void testRepositoryPersistence() { 
     Op op = mock(Op.class); 

     repository.save(op); 
    } 
} 

nd는 을 거짓으로 나타냅니다.

내가 뭘 잘못하고 있니?

+0

'save' 메서드를 어떻게 호출하는지 보여 줄 수 있습니까? – geoand

+0

여기에 충분한 정보가 없습니다. _How_'@ Transactional'을 해석하고 있습니까? 스프링 프록시 사용하기? Spring AOP 사용하기? 어떤 형태의 직조 사용? 콩이 Spring에 의해 명확하게 만들어 졌습니까? 즉, 어딘가에 자동 실행되고 있습니까? 추신 왜 XML을 사용합니까? –

+0

어떻게 xml 파일을로드할까요? save 메소드를 어떻게 호출하고 있습니까? 여기에 정보가 너무 적습니다. –

답변

7

당신은

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:/integration-context.xml"}) 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false) 
public class RepositoryTest extends AbstractTransactionalJUnit4SpringContextTests{ 
    @Autowired 
    private IRepository repository;   

    @Test 
    public void testRepositoryPersistence() { 
     Op op = mock(Op.class); 

     repository.save(op); 
    } 
} 

this 자습서를 참조하여 테스트 클래스에 RepositoryClass

public class Repository implements IRepository{ 
    @Transactional 
     public void save(Op op) { 
      System.out.println("Transaction active:::: " + TransactionSynchronizationManager.isActualTransactionActive()); 

    ... 
    } 
} 

에 구성

<context:annotation-config/> 

<tx:annotation-driven transaction-manager="transactionManager"/> 
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource"></property> 
</bean> 

인터페이스를 추가 할이를 추가하고이되어야합니다.

+2

+1 이것은 아마도 _ 정확합니다. OP가 위빙 (로드 또는 컴파일 시간)을 사용한다면 '인터페이스'는 엄격히 말하면 필요 없다는 점에 유의해야합니다. 가장 확실한 좋은 연습! –

+0

그 중 일부는 작동했습니다! 정말 고맙습니다!!! –

+1

테스트를 트랜잭션 경계로 사용하려는 경우에만 'AbstractTransactionalJUnit4SpringContextTests'를 확장 할 필요가 없습니다. 트랜잭션이 작동 할 필요는 없습니다. 이 설정은 기본적으로 (@ REQUIRES_NEW 또는 NEVER 전파 레벨이 아니면)이 서비스에서'@ Transactional'을 쓸모 없게 만듭니다. –