OSGI - 拆分多个包中的实体

时间:2016-05-25 17:49:43

标签: java jpa osgi apache-karaf

我正在使用karaf 4.0.4运行osgi应用程序。

我的应用程序使用单个PostgreSQL数据库。 连接器由pax-jdbc处理。 我使用了Karaf 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注释的类。

  • 首先,我只是尝试基本添加这些包并运行它。可以在BC中找到entityManager。
  • 接下来尝试在我的每个捆绑包中添加persistence.xml文件,但它不起作用,A中的方案被视为不同,并且它不会从{{{{}}加载扩展类1}}和B
  • 然后我尝试将C分成两半:一个(B-Main)包含我想要实现的服务,另一个(B-frag)作为由B托管的包片段。捆绑model也是一样的。 安装Cmodel,以及AB-Main(或B-fragC-Main)工作正常。但是,如果我尝试安装C-fragB-MainB-fragC-Main,我会收到以下错误:

C-frag

我认为这是因为当第二个片段被解析时,它会重新加载主机片段并尝试重新映射已经存在的entitymanager上的实体(不确定)。

1 个答案:

答案 0 :(得分:2)

OSGi规范4.2 127.3.2定义了持久性捆绑包。它包含一个或多个持久性单元。持久性单元中定义的所有实体都必须来自bundle的jar。它们可能不是来自片段。

我认为理论上你可以将实体类放在另一个包中,但前提是持久性包导入这些包。所以你不能用它来扩展类,以便主持久化包不知道它们。