Spring Testを使用したSQLスクリプトの実行は変更を確定しています
-
12-12-2019 - |
質問
Springを使用して、私の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);
}
}
.
ここに私が何らかの研究に基づいて起こっていると思うものです。 ExecuteQLScriptの最初の呼び出しは別のトランザクションで実行されています。 SpringのSimpleJDbctemplate.UpdateメソッドはExecuteQLScriptによって呼び出されます。これは、接続プールから取得されているJDBC接続のスコープであるため、DBへの後続のアクセスで同じ接続を取得することは保証されず、したがって同じトランザクションで実行することが保証されることはできません。
TransactionManagerまたは(Hibernate Session Factory)を介してすべてのDB操作を行うことになった場合は、内部がトランザクションを照会する方法が原因で機能します。ここでの私のオプションは次のとおりです。
-
simplejdbctemplate.updateとその後の実際のコードの実行方法と同じトランザクションでテストする方法を把握してください。私はこれをする可能性があると思いますが、これまでのところ私の努力は無実でした。
-
私のテストデータをすべてSessionFactoryを通して設定します。したがって、JDBCを介してSTRARIDE SQLスクリプトを実行する代わりに、モデルオブジェクトを作成し、Hibernate DAOを介してそれらを永続化します。
私はここで右の軌道にありますか?誰かがそれ以上のガイダンスを提供することができますか?
解決 2
私の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>
. 他のヒント
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に渡すこともできます。