Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring@Transactional不工作_Java_Spring_Transactions_Spring Transactions - Fatal编程技术网

Java Spring@Transactional不工作

Java Spring@Transactional不工作,java,spring,transactions,spring-transactions,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">

我正在尝试使用带注释的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>
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);
    }
}
呼叫代码:

<?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);
    }
}
并且它给出了FALSE。


我做错了什么?

您应该在配置中添加此选项

<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>
这在你的测试课上

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

请参阅教程。

您能否演示如何调用
save
方法?这里没有足够的信息。您如何解释
@Transactional
?使用Spring代理?使用SpringAOP?使用某种形式的编织?这个bean肯定是由Spring创建的吗?也就是说,它在某个地方被自动连接?为什么要使用XML?如何加载XML文件,如何调用save方法。这里的信息太少。扩展了我的问题。您是否尝试过
?+1,因为这可能是正确的。值得注意的是,如果OP使用的是编织(加载或编译时),那么严格来说,
接口
不是必需的。当然,这是一个很好的实践!只有当您希望测试成为事务边界时,才真正需要扩展
AbstractTransactionalJUnit4SpringContextTests
。事务不一定要工作。此设置基本上使此服务上的
@Transactional
无效(除非它需要新的或从不传播级别)。