我正在开发一个使用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.xml
和test-persistence.xml
中列表的重复,因为我觉得我可以自动生成第二个文件。
我怎样才能动态地执行此操作,以便在添加/删除实体时不需要更改这两个XML文件?
答案 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>
希望这有帮助。