0

データベース統合テストに次の構成を使用しています。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/spring-master.xml"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
@Transactional()
public class EmployeeAccessPropertyTest {

spring-master.xmlは、Spring 構成ファイルを次の順序でロードします。

<import resource="classpath:spring/db/dev-datasource-config.xml"/>
<import resource="classpath:spring/db/jpa-config.xml"/>
<import resource="classpath:spring/db/transaction-config.xml"/>
<import resource="classpath:spring/db/component-config.xml"/>

dev-datasource-config.xmlは dataSource を定義し、liquibase を介して db スキームを初期化します。

<context:property-placeholder location="classpath:db/config/dev-data-access.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
<bean id="liquibase" class="liquibase.integration.spring.SpringLiquibase">
    <property name="dataSource" ref="dataSource" />
    <property name="changeLog" value="classpath:db/changelog/db.changelog-master.xml" />
    <property name="dropFirst" value="true" />
</bean>

今、テストを実行すると、次のエラーが発生します。

javax.persistence.PersistenceException: [PersistenceUnit: studentPersistenceUnit] Unable to build EntityManagerFactory
...
Caused by: org.hibernate.HibernateException: Missing table: employees

entityManagerFactory が初期化されたときにテーブルが作成されないようです(jpa-config.xmlファイル内)。まず、liquibase maven プラグインを介してスキームを生成します。

mvn initialize liquibase:update

Spring コンテキストを介して、次の db スキーム生成をコメント化します。

<!--<bean id="liquibase" class="liquibase.integration.spring.SpringLiquibase">-->
    <!--<property name="dataSource" ref="dataSource" />-->
    <!--<property name="changeLog" value="classpath:db/changelog/db.changelog-master.xml" />-->
    <!--<property name="dropFirst" value="true" />-->
<!--</bean>-->

そして、問題はなくなりました。Spring が最初に dev-datasource-config.xml をロードし、liquibase Bean を初期化してから、jpa-config.xml をロードするようにするにはどうすればよいですか。

<bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
      p:dataSource-ref="dataSource"/>
4

1 に答える 1