Выполнение SQL Script с помощью пружинного теста совершает изменения

StackOverflow https://stackoverflow.com//questions/9673815

Вопрос

Я пытаюсь выполнить скрипт SQL в моем тесте JUnit, используя весну. Сценарий используется для настройки данных для тестов. Однако, когда сценарий работает, вставки в сценарии предаются после каждого теста. Весенняя документация говорит, что не ожидает отката с DDL, но все в моем скрипте является DML. Все, что он содержит, это вставьте утверждения и получить последнюю идентификатор вставки (установить @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);
}
}
.

Вот то, что я думаю, происходит на основе некоторых исследований. Первый вызов для executeqlscript работает в отдельной транзакции. SimpleJDBCTEMPTEMPTEMPTEMPTATE SISTEJDBCTEMPLATE.UPDATE называется ExecuteQLScript. Поскольку это имеет место для соединения JDBC, которое получается из пула соединения, я не гарантированно получаю то же соединение на последующих доступах к БД и, следовательно, не может быть гарантирован в той же транзакции.

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

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

  2. Делайте все мои тестовые данные, настроенные через Sessionfactory. Итак, вместо того, чтобы выполнять прямые сценарии SQL через JDBC, я бы заполнил модельные объекты и устанавливаю их через Hibernate DAO.

  3. Я на правильном пути здесь? Может ли кто-нибудь предоставить больше руководства?

Это было полезно?

Решение 2

Я смог решить это, добавив следующий «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>
.

Другие советы

У вас, вероятно, есть автоматический коммит, включенный в соединении БД.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top