2016-05-25 88 views
0

我正在製作一個運行在karaf 4.0.4上的osgi應用程序。OSGI - 多個包中的拆分實體

我的應用程序使用單個PostgreSQL數據庫。 連接器由pax-jdbc處理。 我使用卡拉夫JPA 2.3.0功能和Hibernate 4.3.6.Final功能。

某些模塊提供可添加/刪除的服務。

TL/DR:有無論如何分裂我的實體在多個捆綁?

這裏是我的情況:

我現在有一個模塊名爲model持有

  • persistence.xml文件
  • 類註釋@Entity
  • 類註釋@Entity@Inheritance(strategy = InheritanceType.JOINED)
  • 服務訪問我的實體。

這裏是我的持久性文件:

<persistence version="2.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 

    <persistence-unit name="maindb" transaction-type="JTA"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=maindb)</jta-data-source> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> 
      <!-- <property name="hibernate.hbm2ddl.auto" value="create-drop"/> --> 
     </properties> 
    </persistence-unit> 

</persistence> 

,這是子類來訪問這些實體抽象服務:

public abstract class AbstractDaoService<T> implements IDaoService<T> { 

    @PersistenceContext(unitName = "maindb") 
    protected EntityManager entitymanager; 

    protected Class<T> clazz; 

    public AbstractDaoService(Class<T> clazz) { 
     this.clazz = clazz; 
    } 

    @Override 
    public T find(Object id) { 
     return entitymanager.find(clazz, id); 
    } 

    // rest of class is omitted 
} 

現在,我還有其他3根。讓我們稱他們爲A,B和C.通過藍圖注入的服務使用實體model。這工作正常。

但問題是,A也使用B和C提供的服務。在這兩個包中的每一箇中,都有註釋類@Entity以及擴展了@Inheritance註釋的類。

  • 起初,我試圖基本上添加這些捆綁並運行它。 entityManager可以在BC中找到。
  • 下一頁學嘗試是添加persistence.xml文件中的每一我捆的,但它並不作品在A方案被看作是不同的,它不會從B加載擴展類和C
  • 然後我試圖將B分爲兩部分:一部分(B-Main)和我想要實現的服務,另一部分(B-frag)作爲由model託管的捆綁分段。捆綁C同樣的事情。 安裝model,A,只是B-MainB-frag(或C-MainC-frag)工作正常。但是,如果我嘗試安裝B-MainB-fragC-MainC-frag,我得到以下錯誤:

javax.persistence.PersistenceException: [PersistenceUnit: maindb] Unable to build Hibernate SessionFactory 
... 
Caused by: org.hibernate.DuplicateMappingException: Duplicate class/entity mapping <my class annotated with @Inheritance`> 

我想這是因爲當第二個片段得到解決,重新放回主機片段,並嘗試重新映射在現有的EntityManager(不知道)的實體。

回答

2

OSGi spec 4.2 127.3.2定義了Persistence Bundle。它包含一個或多個持久性單元。所有在持久化單元中定義的實體都必須來自bundle的jar。他們可能不是來自片段。

我想你理論上可以把實體類放在另一個包中,但只有當持久性包導入這些包時纔可以。所以你不能用這種方式來延長課程,因爲主持久性束不知道它們。

+0

它太糟糕了,它不能被擴展,在我看來,這是模塊化的巨大損失。如果我的持久性包中有與其他實體無關的實體呢?我可以擁有多個持久性捆綁包,並使用類似'persitence.xml'文件的不相關實體嗎? – jhamon

+0

您可以擁有多個持久性單元,但它們將在數據庫上不受影響。無論如何,我認爲擴展在實踐中是行不通的,但數據庫始終是一樣的。 –