Выполнение скрипта SQL с использованием Spring Test фиксирует изменения - PullRequest
1 голос
/ 12 марта 2012

Я пытаюсь выполнить сценарий SQL в моем тесте JUnit, используя Spring.Сценарий используется для настройки данных для тестов.Однако при запуске сценария вставки в сценарии фиксируются после каждого теста.В документации Spring написано, что не стоит ожидать отката с DDL, но все, что написано в моем скрипте - это DML.В нем содержатся только операторы INSERT и получение последнего идентификатора вставки (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 выполняется в отдельной транзакции.Метод SpringJ SimpleJdbcTemplate.update вызывается executeSqlScript.Поскольку это относится к JDBC-соединению, полученному из пула соединений, я не гарантирую получить такое же соединение при последующем доступе к БД и, следовательно, не могу гарантировать выполнение в той же транзакции.

Если бы я выполнял все свои операции с БД через TransactionManager или (Hibernate Session Factory), то это работало бы из-за того, как внутренние компоненты охватывают транзакции.Мои варианты здесь:

  1. Узнайте, как запустить SimpleJdbcTemplate.update и последующий фактический код, который я тестирую в той же транзакции.Я думаю, что, возможно, смогу сделать это, но мои усилия до сих пор были бесплодными.

  2. Все мои тестовые данные настроены через SessionFactory.Таким образом, вместо выполнения простых сценариев SQL через JDBC, я бы заполнил объекты модели и сохранил их в Hibernate DAO.

Я на правильном пути?Кто-нибудь может дать еще какие-нибудь рекомендации?

Ответы [ 2 ]

1 голос
/ 13 марта 2012

Возможно, у вас включена автоматическая фиксация при подключении к базе данных.

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

Обратите внимание, что вы также можете передавать этот аргумент в URL-адресе jdbc.

0 голосов
/ 14 марта 2012

Мне удалось решить эту проблему, добавив следующий 'jpaVendorAdapter' к объявлению моего 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...