1

私は、永続性とトランザクション管理にJPA/HIbernateとSpringを使用するプロジェクトに取り組んでいます。このアプリケーションには、同じデータベースサーバー(Sybase環境)の複数のカタログとスキーマからマップされたテーブルがあります。

インメモリデータベースを使用してこのアプリの自動テストの作成を開始するにはtest-persistence.xml、デフォルトからすべて同じエンティティを一覧表示する代替を作成する必要がありましたが、クラスのアノテーションからのスキーマ情報をオーバーライドpersistence.xmlする代替マッピングファイルを指定しました。orm.xml

テスト用のSpring構成の重要な部分は、次のとおりです。

<bean id="hsqlFixes" class="com.example.app.util.HSQLFixes" />
<bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
      depends-on="hsqlFixes">
    <property name="persistenceUnitName" value="puName" />
    <property name="persistenceXmlLocation"
              value="META-INF/persistence-tests.xml" />
....
</bean>

HSQLFixesいくつかのタイプを作成するだけでいくつかのJDBCステートメントを実行するBeanはどこにありますか。

そして:でpersistence-tests.xml

<persistence-unit name="puName" transaction-type="RESOURCE_LOCAL">
    <mapping-file>META-INF/orm-tests-db1.xml</mapping-file>
    <mapping-file>META-INF/orm-tests-db2.xml</mapping-file>
    <mapping-file>META-INF/orm-tests-db3.xml</mapping-file>
    ... followed by the same list of entities from persistence.xml

persistence.xmlここで、とにリストされているクラスの重複を取り除きたいと思いtest-persistence.xmlます。これは、この2番目のファイルの生成を自動化できると感じたためです。

エンティティを追加/削除するときに両方のXMLファイルを変更する必要がないように、動的に実行するにはどうすればよいですか?

4

1 に答える 1

1

複数のpersistence.xmlまたは複数の永続性ユニットを回避するために、プログラムでテスト永続性ユニットを構成することをお勧めします。このケースは、マッピングファイルのオーバーライドを伴うため、複数のスキーマ要件によって少し複雑になります。EntityManagerFactoryを作成するときに標準プロパティを渡すのは簡単ですが、この場合、 MutablePersistenceUnitInfoを使用してPersistenceUnitPostProcessorを使用して、マッピングファイル参照を追加する必要があります。

JPA2.0を使用してエンティティクラスをプログラムでロードする方法をご覧ください。これを構成する方法の良い例として。MutablePersistenceUnitInfoのAPIを使用すると、マッピングファイルの参照を追加できます。クラスrefに関しては、後処理で変更している元のpersistence.xmlからこれを自動的に取得します(テスト構成のみ)。これにより、重複の問題が解決されます。

したがって、次のようなPersistenceUnitPostProcessorになってしまう可能性があります。

public class ConfigureTestMappingFiles implements PersistenceUnitPostProcessor {
    private List<String> mappingFiles;
    @Override
    public void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) {
        if (mappingFiles != null) {
            pui.getMappingFileNames().addAll(mappingFiles);
        }
    }
    // ... getter and setter for mappingFiles
}

そして、あなたの構成では、次のように登録します。

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    depends-on="hsqlFixes">
    <property name="persistenceUnitName" value="programasPlanosEnsino" />
    <property name="persistenceXmlLocation" value="META-INF/persistence.xml" />
            ...
    <property name="persistenceUnitPostProcessors">
        <list>
            <bean class="com.example.test.ConfigureTestMappingFiles">
                <property name="mappingFiles">
                    <list>
                        <value>META-INF/orm-tests-db1.xml</value>
                        <value>META-INF/orm-tests-db2.xml</value>
                        ... add more as needed
                    </list>
                </property>
            </bean>
        </list>
    </property>

お役に立てれば。

于 2012-09-05T03:29:37.657 に答える