在OSGi中使用Hibernate而不定义包/类来扫描属性

时间:2014-07-10 07:13:48

标签: hibernate osgi hibernate-mapping spring-orm

我有以下情况:

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的环境中工作。我正在制作使用Project A来保存其实体的小组件/ Bundles。项目A将首先加载,因为其他人依赖它。

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

现在任何包试图使用项目A来保持对象将最终出现异常,这很明显

org.hibernate.MappingException:未知实体:

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

2 个答案:

答案 0 :(得分:1)

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

我对你的建议是:

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

答案 1 :(得分: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。