Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OSGi中使用Hibernate而不定义要扫描属性的包/类_Hibernate_Osgi_Hibernate Mapping_Spring Orm - Fatal编程技术网

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

在OSGi中使用Hibernate而不定义要扫描属性的包/类,hibernate,osgi,hibernate-mapping,spring-orm,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 - 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:未知实体:


是否有任何方法可以在不扫描任何包/类的情况下持久化实体…?

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

我给你的建议是:

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

  • Hibernate不能很好地与OSGi配合使用。请参阅

    EclipseLink通过双子座项目支持OSGi,但也有类似的限制:


    Apache Aries JPA允许您通过清单中的元持久性头为每个捆绑包创建一个PersistenceUnit:。这可能允许您在捆绑包B和C之间共享项目A中的persistence.xml,但我想这仍然会创建两个不同的PersistenceUnits/sessionFactorys。

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