【问题标题】:Using Hibernate in OSGi without defining packages/classes to scan property在 OSGi 中使用 Hibernate 而不定义包/类来扫描属性
【发布时间】:2014-08-31 11:22:01
【问题描述】:

我有以下情况:

Project A - Contains a DB-Configurations and Creates Session_Factory at Init.
Project B - Contains entities and using Project A to persist entities.
Project C - Contains entities and using Project A to persist entities.

我正在使用 karaf 在基于 OSGi 的环境中工作。我正在制作使用项目 A 来持久化其实体的小型组件/捆绑包。项目 A 将始终首先加载,因为其他项目依赖于它。

项目 A 将在启动时启动会话工厂,但没有任何包/类来扫描实体。

现在任何包尝试使用项目 A 持久化对象都会导致异常,这是显而易见的

org.hibernate.MappingException:未知实体:

有什么方法可以在不扫描任何包/类的情况下保留实体...?

【问题讨论】:

    标签: hibernate osgi hibernate-mapping spring-orm


    【解决方案1】:

    SessionFactory 在持久化之前必须了解实体。在您的情况下,如果您将 B 和 C 中的一些类注册到 A,SessionFactory 可能会存储对这些类的一些引用,从而破坏模块化。

    我给你的建议是:

    1. 项目 A:创建 java.sql.DataSource 并将其导出为 osgi 服务。
    2. 项目 B 和 C:导入 java.sql.DataSource 并创建自己的 SessionFactory、DAO 层和 Service 层,并将服务层导出为 osgi 服务。

    【讨论】:

    • 我的做法与您提到的相同,但唯一的区别是项目 A 将数据源公开为服务。项目 B 和 C 正在使用该服务并将其发送到项目 A 的 Dao 类,以从该数据源创建会话工厂。我们只想创建一个会话工厂,它可以保留所有项目中的所有实体。感谢您的回复。如果您对此有任何解决方案,请回复。
    • “只有一个会话工厂”的原因是什么?
    • 基本上我们正在开发小包中的用例。有可能 50 个用例最终会出现在 50 个捆绑包中[在 OSGi(karaf) 中]。现在,如果 50 个捆绑包中有 30 个正在使用数据库,那么我们将拥有 30 个独立的连接工厂。我不知道多少,但它会消耗资源。这就是为什么我们想要有一个单一的连接工厂的原因。
    • 会话工厂不是用于创建“连接”,但不是“连接工厂”。它只存储一些配置和 JPA 元数据,我看不出它会“消耗资源”的原因。在您的情况下,连接是从单例的数据源中检索的,并通过 OSGi 公开。
    • 您对单例数据源的看法是正确的。但是我们正在使用该单例数据源来创建连接工厂。并使用 Hibernate Session 和 Transaction。现在的问题是 30 个捆绑包正在使用该单例数据源来创建 30 个会话工厂。我们认为这是不正确的事情。因为我们不确定将来会有多少捆绑包。
    【解决方案2】:

    Hibernate 不能很好地与 OSGi 配合使用。请参阅http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch17.html#d5e5021 上的警告

    EclipseLink 通过 Gemini 项目支持 OSGi,但也有类似的限制: http://wiki.eclipse.org/Gemini/JPA/Documentation/Limitations

    Apache Aries JPA 允许您通过清单中的 Meta-Persistence 标头为每个 Bundle 创建一个 PersistenceUnit:http://aries.apache.org/modules/jpaproject.html。这可以让您在包 B 和 C 之间共享项目 A 中的 persistence.xml,但我猜这仍然会创建两个不同的 PersistenceUnits/SessionFactories。

    【讨论】:

      猜你喜欢
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多