OSGI - 在多个包中拆分实体
OSGI - Split entities in multiple bundles
我正在 karaf 4.0.4 上制作一个 osgi 应用程序 运行ning。
我的应用程序使用单个 PostgreSQL 数据库。
连接器由 pax-jdbc 处理。
我使用 Karaf JPA 2.3.0
功能和 Hibernate 4.3.6.Final
功能。
一些模块提供的服务可以是 added/removed。
TL/DR:是否可以将我的实体分成多个包?
这是我的情况:
我目前有一个名为 model
的模块,其中包含
- 我的
persistence.xml
文件
- classes 注释
@Entity
- classes 注释
@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>
以及子class访问这些实体的抽象服务:
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。A 通过蓝图注入的服务使用来自 model
的实体。这很好用。
但问题是 A 也使用 B 和 C 提供的服务。并且在这 2 个捆绑包中的每一个中,都有 class 注释 @Entity
和 class extending extending带有 @Inheritance
注释的。
- 起初,我只是尝试基本上添加这些包和 运行 它。 entityManager 可以在
B
和 C
中找到。
- 下一步尝试在我的每个包中添加一个
persistence.xml
文件,但它不起作用,因为 A
中的方案被视为不同,并且不会加载扩展 class 来自 B
和 C
- 然后我尝试将
B
分成两半:一个 (B-Main) 包含我想要实现的服务,另一个 (B-frag) 作为由 [=15 托管的 bundle-fragment =].捆绑包 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`>
我认为这是因为当第二个片段被解析时,它重新加载主机片段并尝试重新映射已经存在的实体管理器上的实体(不确定)。
OSGi 规范 4.2 127.3.2 定义了 Persistence Bundle。它包含一个或多个持久性单元。持久化单元中定义的所有实体必须源自包的 jar。它们可能不是来自片段。
我认为理论上您可以将实体 类 放入另一个包中,但前提是持久性包导入这些包。所以你以后不能用它来扩展类,因为主持久性包不知道它们。
我正在 karaf 4.0.4 上制作一个 osgi 应用程序 运行ning。
我的应用程序使用单个 PostgreSQL 数据库。
连接器由 pax-jdbc 处理。
我使用 Karaf JPA 2.3.0
功能和 Hibernate 4.3.6.Final
功能。
一些模块提供的服务可以是 added/removed。
TL/DR:是否可以将我的实体分成多个包?
这是我的情况:
我目前有一个名为 model
的模块,其中包含
- 我的
persistence.xml
文件 - classes 注释
@Entity
- classes 注释
@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>
以及子class访问这些实体的抽象服务:
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。A 通过蓝图注入的服务使用来自 model
的实体。这很好用。
但问题是 A 也使用 B 和 C 提供的服务。并且在这 2 个捆绑包中的每一个中,都有 class 注释 @Entity
和 class extending extending带有 @Inheritance
注释的。
- 起初,我只是尝试基本上添加这些包和 运行 它。 entityManager 可以在
B
和C
中找到。 - 下一步尝试在我的每个包中添加一个
persistence.xml
文件,但它不起作用,因为A
中的方案被视为不同,并且不会加载扩展 class 来自B
和C
- 然后我尝试将
B
分成两半:一个 (B-Main) 包含我想要实现的服务,另一个 (B-frag) 作为由 [=15 托管的 bundle-fragment =].捆绑包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`>
我认为这是因为当第二个片段被解析时,它重新加载主机片段并尝试重新映射已经存在的实体管理器上的实体(不确定)。
OSGi 规范 4.2 127.3.2 定义了 Persistence Bundle。它包含一个或多个持久性单元。持久化单元中定义的所有实体必须源自包的 jar。它们可能不是来自片段。
我认为理论上您可以将实体 类 放入另一个包中,但前提是持久性包导入这些包。所以你以后不能用它来扩展类,因为主持久性包不知道它们。