如何重用persistence.xml中的类声明?

时间:2012-09-04 11:41:07

标签: spring jpa configuration spring-jdbc spring-orm

我正在开发一个使用JPA / HIbernate和Spring进行持久性和事务管理的项目。此应用程序具有从同一数据库服务器(Sybase环境)的多个目录和模式映射的表。

为了使用内存数据库开始为此应用程序创建自动化测试,我必须创建一个替代test-persistence.xml列出默认persistence.xml中的所有相同实体,但指定替代orm.xml 1}}映射文件,覆盖类中注释的架构信息。

我的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文件?

1 个答案:

答案 0 :(得分:1)

我建议以编程方式配置测试持久性单元,以避免多个persistence.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>

希望这有帮助。