我正在製作一個運行在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可以在
B
和C
中找到。 - 下一頁學嘗試是添加
persistence.xml
文件中的每一我捆的,但它並不作品在A
方案被看作是不同的,它不會從B
加載擴展類和C
- 然後我試圖將
B
分爲兩部分:一部分(B-Main)和我想要實現的服務,另一部分(B-frag)作爲由model
託管的捆綁分段。捆綁C
同樣的事情。 安裝model
,A
,只是B-Main
和B-frag
(或C-Main
和C-frag
)工作正常。但是,如果我嘗試安裝B-Main
,B-frag
,C-Main
和C-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(不知道)的實體。
它太糟糕了,它不能被擴展,在我看來,這是模塊化的巨大損失。如果我的持久性包中有與其他實體無關的實體呢?我可以擁有多個持久性捆綁包,並使用類似'persitence.xml'文件的不相關實體嗎? – jhamon
您可以擁有多個持久性單元,但它們將在數據庫上不受影響。無論如何,我認爲擴展在實踐中是行不通的,但數據庫始終是一樣的。 –