1

我有以下情况:

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:未知实体:

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

4

2 回答 2

1

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。

于 2014-07-10T08:14:26.970 回答
1

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

我对你的建议是:

  1. 项目 A:创建 java.sql.DataSource 并将其导出为 osgi 服务。
  2. 项目B和C:导入java.sql.DataSource并创建自己的SessionFactory、DAO层和Service层,并将服务层导出为osgi服务。
于 2014-07-10T07:44:43.397 回答