我試圖在使用Spring-test時沒有成功的情況下獲取JDBC事務回滾。當我運行以下時,SQL更新始終被提交。Spring JDBC測試上的事務回滾
package my.dao.impl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.transaction.TransactionConfiguration;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.Statement;
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
@ContextConfiguration(locations={"classpath:ApplicationContext-test-DAOs.xml"})
@TransactionConfiguration(defaultRollback = true)
public class ConfirmationMatchingDAOImplTest {
@Autowired
private DataSource dataSource;
@Test
public void shouldInsertSomething() throws Exception {
final Connection connection = dataSource.getConnection();
final Statement statement = connection.createStatement();
statement.executeUpdate("insert into TEST_INSERT values (1, 'hello')");
statement.close();
connection.close();
}
}
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="jdbc:sqlserver://makeitfunky:1490;databaseName=fonzie"/>
<property name="username" value="ralph"/>
<property name="password" value="p0n1es_R_kew1"/>
</bean>
我在做什麼錯?
此外,我是否使用了太多註釋?我可以讓它更清潔一點嗎?
我刪除了@TestExecutionListeners並添加了@Transactional。然後我必須添加一個transactionManager bean到應用程序上下文(DataSourceTransactionManager)。 Txn沒有回滾,所以我添加了@TransactionConfiguration(defaultRollback = true)。 Txn仍然沒有回滾,所以我在測試方法中添加了@Rollback。只有那時我纔看到Spring日誌回滾了txn,但更新仍然持續到數據庫。可能與SQL Server及其驅動程序有關? – Synesso 2010-10-29 02:21:43
添加DataSourceUtils到我的答案。 – 2010-10-29 02:35:09
啊,我沒有得到你最後的評論通知。在此期間,我改變了我的上下文以將數據源包裝在TransactionAwareDataSourceProxy中。這工作。所以你去了,有兩種方法來做同樣的事情。現在看看我可以擺脫這7個註釋中的哪一個,並且仍然有效。 – Synesso 2010-10-29 03:41:31