2012-02-29 117 views
6

我有一個項目設置,其中我已經模塊化一個項目,並將一個模塊打包到一個jar文件中,當我們創建一個war並部署它時,它將包含在主項目中。 我面臨的問題是,我有一個實體存在於模塊中,該模塊在啓動期間構建unitName的JPA Container EntityManagerFactory時未加載。從外部Jar文件加載JPA實體

我所擁有的基本問題是在persistence.xml中不執行EntityManager查找,然後加載指定的屬性,然後掃描@Entity註釋的所有包?

任何有關如何工作,以及如何解決這個問題的意見將是偉大的。

我發現這個鏈接,它提到了創建獨立的persistenceUnits,但在這裏我不需要一個單獨的持久單元。我只需要模塊捎帶父項目並加載實體和其他@Resource,@Component類,由於上下文:組件掃描和註釋配置。

http://javathoughts.capesugarbird.com/2009/02/jpa-and-multiple-persistence-units.html

這裏是我的代碼/配置EnitityManagerFactory的

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="persistenceUnitName" value="LineManagement" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="generateDdl" value="false" /> 
      <property name="showSql" value="false" /> 
      <property name="databasePlatform" ref="cpsHibernateDialectClassName" /> 
     </bean> 
    </property> 
    <property name="beanName" value="entityManager"></property> 
</bean> 

定義啓動實體管理器。

<persistence-unit name="LineManagement" transaction-type="RESOURCE_LOCAL"> 
    <properties> 
     <property name="hibernate.id.new_generator_mappings" value="true" /> 
     <property name="hibernate.current_session_context_class" value="thread" /> 
     <property name="hibernate.default_batch_fetch_size" value="200" /> 

....

的persistence.xml限定第二級高速緩存和其它休眠特性。

然後,該模塊具有一個實體。

import javax.persistence.Entity; 


@Entity 
@Table(name = IntegrationEvent.TABLE_NAME, uniqueConstraints = @UniqueConstraint(columnNames = "INTGRTN_EVNT_QUEUE_SK")) 
@GenericGenerator(name = "UUID_GEN", strategy = "org.hibernate.id.UUIDHexGenerator",  parameters = { @Parameter(name = "separator", value = "-") }) 
public class IntegrationEvent implements Serializable { 

.... }

注:該實體是在不同的包比親本,因爲它是在其自己的一個單獨的模塊。

在主項目中加載正常的實體。

package com.parent.line.entity; 

import javax.persistence.Entity; 

@Entity 
@Table(name = "ACCOUNT") 
@Cacheable(true) 
public class Account 
    implements LMLookupTypeEntityByDivision, Serializable, Comparable<Account> { 
+1

問題是因爲我將模塊作爲依賴添加到我的父項目中,因爲它完全分離。因此它會放在我的WEB-INF/lib文件夾中。在調試加載實體的JPA代碼後,我意識到它開始掃描@Entity註釋的類路徑來自WEB-INF/classes。這是有道理的,因爲lib是隻讀的。現在,我不得不考慮在classes文件夾中添加模塊,或者在persistence.xml中使用標記,以便使jar實體能夠被掃描和加載 – Hrishikesh 2012-03-01 17:57:20

回答

4

要掃描駐留在jar中的實體,必須將其包含在persistence.xml中。 <jar-file>packedEntity.jar</jar-file>

如果你想從包中加載單元,那麼你可以嘗試直接從jar中注入它。 @PersistenceContext(unitName = "../packedEntity.jar#main")

沒有嘗試過,但您可以爲實體 <property name="hibernate.archive.autodetection" value="class, hbm"/>

1

在工作中我們不使用JPA,但Hibernate的Hibernate的自動檢測,我們的項目是完全模塊化的。 我們處理大約30個國家不使用相同的模塊,我們能夠通過簡單地改變maven依賴關係(無需修改orm文件)在會話工廠中加載所有這些模塊的實體。

使用的解決方案是使用Java SPI。 ServiceLoader將查找實現核心接口EntityProvider的類。 每個模塊的每個EntityProvider將硬編碼它所帶來的實體,並在調用ServiceLoader.load(EntityProvider.class)時返回一個實體列表。 因此,在平臺核心中,我們只需創建一個基於彈簧的會話工廠,在該工廠中我們通過將調用SPI的工廠bean提供實體列表。

我不知道JPA是否會很容易,但我很確定這是可能的,但您可能需要手動創建EMF從春天的上下文,還有PersistenceUnit我猜...你可能會want是一個持久化單元,它是所有模塊的持久化單元的「合併」(至少對於你的實體) 看看SPI和javax.persistence.spi包。

檢查還怎麼與Spring創建一個EMF: AbstractEntityManagerFactoryBean

編輯:您可以檢查此:using the MergingPersistenceUnitManager to load entity

0

如果您使用的春天開機使用實體掃描註釋在主springboot類

@EntityScan(
     basePackageClasses = {externalpackage.classname.class} 
)