복붙노트

[SPRING] Spring @Transactional이 작동하지 않습니다.

SPRING

Spring @Transactional이 작동하지 않습니다.

내가 주석 TX 봄 지원을 사용하려고합니다.

응용 프로그램 컨텍스트 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);
    }
}

그리고 그것은 거짓을 제공합니다.

내가 뭘 잘못하고 있죠?

해결법

  1. ==============================

    1.구성에이 내용을 추가해야합니다.

    구성에이 내용을 추가해야합니다.

    <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>
    

    RepositoryClass에 인터페이스를 추가하십시오.

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

    그리고 당신의 테스트 수업에서

    @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);
        }
    }
    

    이 자습서를 참조하십시오.

  2. from https://stackoverflow.com/questions/25910350/spring-transactional-is-not-working by cc-by-sa and MIT license