Spring @Transactional is not working

十年热恋 提交于 2019-12-18 08:48:22

问题


I am trying to use annotated TX Spring support.

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

Actual code:

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

    ...
    }
}

Calling code:

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

And it gives FALSE.

What am I doing wrong?


回答1:


You should add this in your configuration

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

add an interface on your RepositoryClass

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

    ...
    }
}

and this in your test class

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

see this tutorial.



来源:https://stackoverflow.com/questions/25910350/spring-transactional-is-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!