我正在尝试使用春天在junit测试中执行SQL脚本。该脚本用于设置测试数据。但是,当运行脚本时,脚本中的插入件在每个测试后都会提交。 Spring Documentation表示不希望用DDL回滚,但我脚本中的一切都是DML。它包含的所有内容都是插入语句并获取最后一个插入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);
}
}
.

这是我认为基于一些研究发生的事情。第一次调用executsqlscript正在单独的事务中运行。 Spring的SimpleJDbctemplate.Update方法由ExecutsQLScript调用。因为这是一个范围的JDBC连接,它是从连接池获得的,所以我不保证在后续访问上获得相同的连接,因此不能保证在相同的交易中运行。

如果我要通过TransactionManager或(Hibernate Session Factory)进行所有DB操作,那么它将起作用,因为内部结构的范围如何范围。我的期权是:

  1. 弄清楚如何运行simplejdbctemplate.update和随后的实际代码我在同一事务中测试。我想我可以这样做,但到目前为止我的努力已经毫无结果。

  2. 通过SessionFactory进行所有测试数据。因此,而不是通过JDBC执行直的SQL脚本,而是我将填充模型对象并通过Hibernate DAO持久地持续。

  3. 我在这里右轨道上吗?任何人都可以提供更多的指导吗?

有帮助吗?

解决方案 2

我能够通过将以下'javendoradapter'添加到我的EntityManagerFactory的声明来解决这个问题。

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

其他提示

您可能在DB连接上启用了自动提交。

<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中传递此参数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top