java - OSGI - 将实体拆分为多个包

标签 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:是否可以将我的实体拆分为多个 bundle ?

这是我的情况:

我目前有一个名为 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 个 bundle 。我们称它们为 A、B 和 C。A 使用 model 中的实体通过蓝图注入(inject)的服务。这工作得很好。

但问题是 A 也使用 B 和 C 提供的服务。在这 2 个包中,都有一个注释为 @Entity 的类。和类扩展扩展 @Inheritance 的类注释。

  • 起初,我只是尝试添加这些包并运行它。实体管理器可以在 B 中找到和C
  • 下一步尝试添加 persistence.xml文件在我的每个包中,但它不能作为 A 中的方案工作被视为不同,它不会加载 B 中的扩展类和C
  • 然后我尝试拆分B一半:一个(B-Main)包含我想要实现的服务,另一个(B-frag)作为由 model 托管的捆绑片段。 bundle 同样如此 C 。 安装model , A ,只是B-MainB-frag (或 C-MainC-frag )工作正常。但如果我尝试安装 B-Main , B-frag , C-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`>

我认为发生这种情况是因为当第二个片段解析时,它会重新加载主机片段并尝试重新映射已存在的实体管理器上的实体(不确定)。

最佳答案

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

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

关于java - OSGI - 将实体拆分为多个包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37444360/

相关文章:

osgi - 安装fragment需要在宿主机上刷新,如何避免?

java - 扩展包在 OSGi 框架中的含义

java - Spring 无法定位 OSGi 命名空间处理程序

java - Android - 如何在我的项目中添加@hide 注释

java - 带有代码的java中对象和引用之间的区别?

java - JPA 事务和触发器/计划作业可能发生冲突

Hibernate OneToMany 为每个父实例选择所有子实例

java - 关于java中的流的问题

java - AspectJ - 针对 Controller 请求方法不起作用的建议

java - 保存父对象后自动保存子对象