2011-06-17 39 views
35

我有一個基於Maven的基於CDI的Java SE應用程序,它有一個核心模塊和其他模塊。
核心有persistence.xml和一些實體。 模塊具有其他實體。JPA 2.0:自動添加實體類到PersistenceUnit *從不同的jar *自動

如何將實體添加到持久性單元的聚光燈?

我看了休眠手冊,http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/configuration.html#setup-configuration-packaging

我也看到了這些所謂的問題

我要尋找一個解決方案,休眠會掃描所有加載的類,或者從其他jar文件中獲取一些配置文件(例如, CDI用beans.xml)。

我的應用程序不使用Spring。 我不堅持可移植性 - 我會堅持使用Hibernate。

  • 有沒有這樣的解決方案?
  • 有沒有辦法從persistence.xml創建一個PU,並以編程方式向它添加類?
  • 我可以在創建後將@Entity類添加到EntityManagerFactory嗎?

更新:org.​hibernate.​ejb.​Ejb3Configuration發現:

public Ejb3Configuration configure(String persistenceUnitName, Map integration) 

http://docs.jboss.org/hibernate/entitymanager/3.6/javadocs/

+0

也許這可能是一個解決方案:http://stackoverflow.com/questions/15026302/multiple-jars-single-persistence-unit-solution – 2013-02-25 11:48:38

回答

2

我已經經歷了同樣的問題,遺憾的是沒有簡單的解決方案,它基本上看起來像JPA的設計不是以這種方式使用。其中一個解決方案是每個頂級項目(應用程序)只有一個 persistence.xml。這有點類似於log4j配置。 persistence.xml必須列出所有類(使用<class>),或者如果不是Java SE應用程序,則列出應用程序使用的jar文件(使用<jar-file>)。這樣,您可以將來自多個模塊(罐子)的實體放入單個持久性單元。缺點是顯而易見的:你必須在一個文件中列出所有內容。

編輯:我(可能)發現,使用XML映射文件另一種解決方案,看看這裏:Multiple jars, single persistence unit solution?

0

可能的複製,見my SO question

我們遇到了同樣的問題,我們發現的唯一方法是將最終(web)應用程序的所有實體都集中在一個persistence.xml中。

同時,我們在我們的測試資源中定義了單獨的persistence.xml文件,因此我們可以運行每個模塊的驗收測試。

10

有幾種方法來解決這個問題:

  1. Do I need <class> elements in persistence.xml?描述,您可以設置hibernate.archive.autodetection財產和Hibernate應該能夠從類路徑中查找所有註釋類。但是,這不符合JPA規範。

  2. 如果使用的是春天,從春3.1.2(或者甚至可能早一點),在LocalContainerEntityManagerFactoryBean,您可以定義packageToScan這將要求LocalContainerEntityManagerFactoryBean在類路徑掃描以查找所有註釋類。同樣,不符合JPA規範。

  3. 我正在使用Maven作爲構建工具。幾年前,我寫了一個插件,在構建過程中生成persistence.xml。該插件將從構建類路徑中掃描以找出所有帶註釋的類,並將其列入生成的persistence.xml中。這是最乏味的,但結果是符合JPA規範。一個缺點(不適用於我認爲的大多數人)是查找發生在構建時,而不是運行時。這意味着如果您的應用程序僅爲部署/運行時提供了實體JAR,而不是構建時間,則此方法不起作用。

+0

對於3點,似乎有人做出了類似的東西是公開avaialble:https://github.com/ljnelson/jpa-maven-plugin – 2014-01-22 01:56:19

+1

對於第2點,您需要禁用通常在'LocalContainerEntityManagerFactoryBean'中配置的persistenceUnit。也就是說,如果指定了persistenceUnit,Spring將忽略'packageToScan'設置。 – 2014-02-14 16:14:16

0

我有一個類似的問題,solved it Hibernate的Integrator SPI:

@Override 
public void integrate(Configuration configuration, 
    SessionFactoryImplementor sessionFactory, 
    SessionFactoryServiceRegistry serviceRegistry) { 

    configuration.addAnnotatedClass(MyEntity.class); 
    configuration.buildMappings(); 
} 

積分作爲Java service提供。

6

Ejb3Configuration已在4.3.0中刪除。如果你不想創建一個Hibernate的集成器,你可以使用屬性「hibernate.ejb.loaded.classes」。

properties.put(
    org.hibernate.jpa.AvailableSettings.LOADED_CLASSES, 
    Arrays.asList(persistentClasses)); 
Persistence.createEntityManagerFactory("persistence-unit", properties); 

其中persistentClasses包含具有實體類的Class []。

+0

LOADED_CLASSES設置被標記爲「僅供內部使用」,並未在使用Maven下載的jar中定義。 – VaclavC 2015-04-21 09:08:31

+0

嘿,我目前使用這個有一個persistence.xml指向幾個jar文件!任何想法爲什麼它被刪除? – Mathias 2015-05-07 14:35:33

4

我有一個略有不同的設置,我將persistence.xml放置在WAR文件中,但它的一些依賴項包括@Entity已註冊分類以包含在持久性單元中。

我已經使用Maven解決了我的問題,有點像Adrian Shum在#3中描述的,但是使用元素來包含待掃描的@Entity註釋的罐子。

我爲每個依賴包括額外的實體添加了一個屬性my-web/pom.xml。我的所有罐子都是Maven多項目構建的一部分,所以對我來說它看起來像。

<properties> 
    <common.jar>common-${project.version}.jar</common.jar> 
    <foo.jar>foo-${project.version}.jar</foo.jar> 
</properties> 

我之後添加以下persistence.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" ... > 
    <persistence-unit name="primary"> 
     <jta-data-source>java:jboss/datasources/mysource</jta-data-source> 

     <jar-file>lib/${common.jar}</jar-file> 
     <jar-file>lib/${foo.jar}</jar-file> 

     ... 
    </persistence-unit> 
</persistence> 

最後我在網上/ pom.xml中配置Maven的資源插件以取代持久的$表達式。XML與在POM

<build> 
    <resources> 
    <resource> 
     <directory>src/main/resources</directory> 
     <filtering>true</filtering> 
     <includes> 
     <include>**/persistence.xml</include> 
     </includes> 
    </resource> 
    <resource> 
     <directory>src/main/resources</directory> 
     <filtering>false</filtering> 
     <excludes> 
     <exclude>**/persistence.xml</exclude> 
     </excludes> 
    </resource> 
    </resources> 
    ... 
</build> 
-4

的JPA設置的屬性2+這樣做的伎倆

<jar-file></jar-file> 

掃描在戰爭中所有的罐子註解@Entity類

1

你可以使用這個概念: https://wiki.eclipse.org/Packaging_and_Deploying_EclipseLink_JPA_Applications_(ELUG)

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="mamcaPU" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>mamcaPU</jta-data-source> 
     <mapping-file>/META-INF/common-layer-mappings.xml</mapping-file> 
    </persistence-unit> 
</persistence> 

共層-mappings.xml

<entity-mappings> 
    <entity class="vub.be.mamca.entity.Surveyactorgrouptable"></entity> 
    <entity class="vub.be.mamca.entity.Userevaluationelicitationtable"></entity> 
    <entity class="vub.be.mamca.entity.Userevaluationtable"></entity> 
    <entity class="vub.be.mamca.entity.Usertable"></entity> 
    <entity class="vub.be.mamca.entity.Userweightelicitationtable"></entity> 
</entity-mappings> 
相關問題