Выполнение SQL Script с помощью пружинного теста совершает изменения
-
12-12-2019 - |
Вопрос
Я пытаюсь выполнить скрипт 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), то она будет работать из-за того, как внутренние возможности охватывают транзакции. Мои варианты здесь:
-
Выясните, как запустить simplejdbctemplate.update и последующий фактический код, который я проверяю в той же транзакции. Я думаю, что могу сделать это, но мои усилия до сих пор были бесплодными.
-
Делайте все мои тестовые данные, настроенные через Sessionfactory. Итак, вместо того, чтобы выполнять прямые сценарии SQL через JDBC, я бы заполнил модельные объекты и устанавливаю их через Hibernate DAO.
Я на правильном пути здесь? Может ли кто-нибудь предоставить больше руководства?
Решение 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.