Spring @Transactional无效

Den*_*gin 4 java spring transactions spring-transactions

我正在尝试使用带注释的TX Spring支持.

应用上下文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>
Run Code Online (Sandbox Code Playgroud)

实际代码:

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

    ...
    }
}
Run Code Online (Sandbox Code Playgroud)

来电代码:

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

它给了FALSE.

我究竟做错了什么?

Xst*_*ian 7

您应该在配置中添加它

<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>
Run Code Online (Sandbox Code Playgroud)

在RepositoryClass上添加一个接口

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

    ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这在你的测试课上

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

教程.

  • +1这是_可能正确_.值得注意的是,如果OP正在使用编织(加载或编译时间),则严格来说不需要`interface`.虽然肯定是好的做法! (2认同)