【问题标题】:OSGI - Split entities in multiple bundlesOSGI - 在多个包中拆分实体
【发布时间】:2016-09-23 11:37:24
【问题描述】:

我正在制作一个在 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。A 通过蓝图注入的服务使用来自model 的实体。这很好用。

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

  • 起初,我只是尝试添加这些捆绑包并运行它。 entityManager 可以在BC 中找到。
  • 下一个尝试是在我的每个包中添加一个persistence.xmlfile,但它不起作用,因为A 中的方案被视为不同,它不会从B 和@987654338 加载扩展类@
  • 然后我尝试将B 分成两半:一个(B-Main)包含我想要实现的服务,另一个(B-frag)作为model 托管的捆绑片段。捆绑包C 也是如此。 安装modelAB-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`>

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

【问题讨论】:

    标签: java jpa osgi apache-karaf


    【解决方案1】:

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

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

    【讨论】:

    • 可惜不能扩展,在我看来,这是模块化的一大损失。如果我有其他实体与我的持久性捆绑包中的实体无关怎么办?我可以拥有多个具有类似persitence.xml 文件的不相关实体的持久性捆绑包吗?
    • 您可以拥有多个持久性单元,但它们与数据库无关。我认为扩展在实践中无论如何都行不通,因为捆绑包来来去去,但数据库总是一样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2016-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多