我正在尝试使用Spring在我的JUnit测试中执行SQL脚本。该脚本用于为测试设置数据。但是,运行脚本时,每次测试后都会提交脚本中的INSERT。 Spring文档说不要期望使用DDL回滚,但我脚本中的所有内容都是DML。它包含的只是INSERT语句并获取最后一个插入ID(SET @blah = LAST_INSERT_ID())。
我配置错了吗?我在MySQL数据库中使用它。我们的配置如下:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/applicationContext.xml" })
@TransactionConfiguration(defaultRollback = true)
public class OrderTestCase extends AbstractTransactionalJUnit4SpringContextTests {
@Before
public void runSql() {
String fileName = StringUtils.replace(getClass().getName(), ".", "/") + ".sql";
Resource resource = applicationContext.getResource(fileName);
if (resource.exists()) {
executeSqlScript(fileName, false);
} else {
LOGGER.debug("Resource doesn't exist: {}", resource);
}
}
@Test
public void testLoadOrders() {
Collection<Order> orders= dao.findAll();
assertTrue(orders.size() == 3);
}
}
以下是基于一些研究我认为正在发生的事情。对executeSqlScript的第一次调用是在一个单独的事务中运行的。 Spring的SimpleJdbcTemplate.update方法由executeSqlScript调用。因为这是从连接池获取的JDBC连接的范围,所以我不保证在后续访问数据库时获得相同的连接,因此无法保证在同一事务中运行。
如果我通过TransactionManager或(Hibernate会话工厂)执行所有数据库操作,那么它将起作用,因为内部事务的范围如何。我的选择是:
弄清楚如何运行SimpleJdbcTemplate.update以及我在同一事务中测试的后续实际代码。我想我可以做到这一点,但到目前为止我的努力都没有结果。
通过SessionFactory设置我的所有测试数据。因此,我不是通过JDBC执行直接的SQL脚本,而是填充模型对象并通过Hibernate DAO持久化它们。
我在这里走在正确的轨道上吗?任何人都可以提供更多指导吗?
答案 0 :(得分:1)
您可能已在数据库连接上启用了自动提交。
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="defaultAutoCommit" value="false"/>
</bean>
请注意,您也可能在jdbc url中传递此参数。
答案 1 :(得分:0)
我能够通过在我的entityManagerFactory的声明中添加以下'jpaVendorAdapter'来解决这个问题。
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
</bean>