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.xmltest-persistence.xml因为我觉得我可以自动生成第二个文件。

我怎么能动态地去做,这样我在添加/删除实体时就不需要更改两个 XML 文件?

4

1 回答 1

1

我建议以编程方式配置您的测试持久性单元,以避免多个持久性.xml 或多个持久性单元。多模式要求使这种情况变得更加复杂,因为它涉及映射文件覆盖。创建 EntityManagerFactory 时很容易传入标准属性,但这种情况需要使用PersistenceUnitPostProcessor使用MutablePersistenceUnitInfo来添加映射文件引用。

看看Programmatically loading Entity classes with JPA 2.0? 有关如何配置它的一个很好的例子。MutablePersistenceUnitInfo上的 API将允许您添加映射文件 refs。至于类 refs,您将自动从您在后期处理中修改的原始 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 回答