4

こんにちは、JPA と単体テストで少し POC を試して、DB スキーマが作成されていることを確認しています。私は H2 DB を使用しており、エンティティからスキーマを作成する Hibernate に設定していますが、DbUnit がデータセットから DB を初期化しようとすると、常にテーブルが取得されます... tableMap に見つかりません。プロパティ DB_CLOSE_DELAY=-1 を DB URL に追加する必要があることを読みましたが、Hibernate がスキーマを作成した後、DbUnit が初期化しようとすると DB が失われるようです。

何か案は?どんな助けでも大歓迎です。

これは私の設定です:

アプリケーションコンテキスト.xml

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSourceH2" />
    <property name="packagesToScan" value="com.xxx.model" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="true" />
            <property name="showSql" value="true" />
            <!-- property name="databasePlatform" value="org.hibernate.dialect.MySQLInnoDBDialect" /-->
            <property name="databasePlatform" value="org.hibernate.dialect.H2Dialect" />
            <!-- property name="database" value="MYSQL" /-->
        </bean>    
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
                <prop key="javax.persistence.validation.mode">CALLBACK</prop>
            </props>
        </property>
    </bean>

<bean id="dataSourceH2"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.h2.Driver" />
        <property name="url" value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1" />
        <property name="username" value="sa" />
        <property name="password" value="" />
    </bean>

リポジトリTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/application-context-test.xml" })
@Transactional
public class SystemEntityRepositoryH2Test {

    @Inject
    private SystemEntityRepository repository;

    @Inject
    private DataSource dataSourceH2;

    private IDatabaseConnection connection;

    @Before
    public void setUp() throws Exception {
        IDatabaseConnection dbUnitCon = null;
        dbUnitCon = new DatabaseDataSourceConnection(dataSourceH2, "testdb");
        dbUnitCon.getConfig().setProperty(DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, true);

        IDataSet dataSet = this.getDataSet("dataset-systementity.xml");
        DatabaseOperation.INSERT.execute(dbUnitCon, dataSet);

    }

    @After
    public void tearDown() throws Exception {
        //DatabaseOperation.DELETE_ALL.execute(this.getConnection(), this.getDataSet(dataSetFile));
    }

    @Test
    public void test() throws Exception {

    }

    protected IDataSet getDataSet(String dataSetFile) throws Exception {
        ResourceLoader resourceLoader = new ClassRelativeResourceLoader(this.getClass());
        Resource resource = resourceLoader.getResource(dataSetFile);

        if (resource.exists()) {
            return new FlatXmlDataSetBuilder().build(resource.getInputStream());
        }

        return null;
    }
}

データセット-systementity.xml

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
    <System_Entities id="2" name="NAME" phone01="+52-55-55555555" email="a@a.com"
                    address01="Street" address02="123" address03="1" address04="Address04"
                    address05="Address05" city="City" state="State" country="MX"
                    zipcode="12345" />
</dataset>

エラー

ERROR DatabaseDataSet:286 - Table 'System_Entities' not found in tableMap=org.dbunit.dataset.OrderedTableNameMap[_tableNames=[], _tableMap={}, _caseSensitiveTableNames=false]

ログにはすべての sql 文がエラーなしで表示されるため、テーブルが hibernate によって作成されていることがわかります。

ありがとう。

解決

ありがとう Mark Robinson setUp メソッドを次のように変更しました。

@Before
    public void setUp() throws Exception {
        IDatabaseConnection dbUnitCon = null;
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        Session session = entityManager.unwrap(Session.class);
        SessionImplementor si = (SessionImplementor) session;
        Connection conn = si.getJdbcConnectionAccess().obtainConnection();
        dbUnitCon = new DatabaseConnection(conn);

        //dbUnitCon.getConfig().setProperty(DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, true);

        IDataSet dataSet = this.getDataSet("dataset-systementity.xml");
        DatabaseOperation.INSERT.execute(dbUnitCon, dataSet);
    }

今は動作しますが、まだ理解していないのは、HSQLDB を使用している場合、この問題は発生しないということです。

4

1 に答える 1

4

問題は、Hibernate が初期化する前に DBUnit がテーブル データをロードしていることです。

の一部として@setup、Hibernate セッションを取得する必要があります。これにより、Hibernate がテーブルを作成するようになります。次のような単純なクエリを実行することで強制することもできますselect 1

于 2013-08-09T19:55:40.080 に答える