2012-09-04 42 views
1

我正在使用JPA/HIbernate和Spring進行持久性和事務管理的項目。此應用程序具有從同一數據庫服務器(Sybase環境)的幾個目錄和模式映射的表。如何重用persistence.xml中的類聲明?

爲了開始創建一種使用內存數據庫這個程序的自動化測試,我不得不創建一個替代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文件?

+0

您使用的是Maven嗎? –

+0

這是一個遺留項目,我被困在Ant中。 – elias

回答

1

我建議以編程方式配置您的測試持久性單元以避免多個persistence.xml或多個持久性單元。由於涉及到映射文件覆蓋,多個模式要求使得這種情況變得更加複雜。標準屬性在創建EntityManagerFactory時很容易傳入,但這種情況下需要使用PersistenceUnitPostProcessor使用MutablePersistenceUnitInfo來添加映射文件引用。

看一看Programmatically loading Entity classes with JPA 2.0?是一個很好的例子,你將如何配置它。 MutablePersistenceUnitInfo上的API將允許您添加映射文件參考。至於類參考,您將從後續處理中修改的原始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> 

希望這有助於。

+0

謝謝,夥計!就像你說的,我使用MutablePersistenceUnitInfo與PersistenceUnitPostProcessor一起工作。 :) – elias

+0

添加了一些代碼的答案,爲下一個誰偶然發現這一點。 – elias

+0

感謝您的編輯。很高興它解決了! –