2

我是 OSGi 的初学者,我的项目包括在 OSGi 容器(apache felix;可分发 jar)中开发和执行持久性捆绑包(使用 jpa),然后通过 jpa 提供程序(Hibernate)与数据库(MySql)通信)。
我阅读了有关 OSGi 的 jpa 规范,因此,如果我理解正确,我必须为 OSGi 使用 JPA 提供程序来实现 OSGI jpa 企业规范。这个 jpa 提供者将跟踪已注册的持久性捆绑包以为其创建 EntityManagerFactory 吗?

那么直接使用 jpa 提供程序创建 EntityManagerFactory (Persistence.createEntityManagerFactory("xx")) 或从注册表中检索它有什么区别:

serviceReferences = context.getServiceReferences(
            EntityManagerFactory.class.getName(),
            String.format("(%s=%s)", 
            EntityManagerFactoryBuilder.JPA_UNIT_NAME,
            persistenceUnit));

我不想使用任何容器(apache karaf,geronimo,spring dm,..)所以,我将在 OSGi 容器中安装和启动就足够了,例如“org.apache.aries.jpa.api”作为 OGSi 企业 jpa 规范的实现,然后只从与我的持久性单元名称关联的注册表中检索“EntityManagerFactory”服务,或者我也应该自己注册一个像 HibernatePersistence 这样的 PersistenceProvider 以在我的持久性中将其声明为“提供者” .xml 文件?

我在这里发现了很多关于这个话题的讨论。不过我还是有问题

谢谢

4

1 回答 1

3

OSGi 是关于服务的,并且通过正确的设置在 OSGi 中使用服务非常容易。您展示了一个带有服务引用的非常老式的示例,我同意,在该模型中,使用老式 JPA 方式要容易得多。

但是,如果您使用声明式服务,则使用服务变得非常轻量级。您将被注入一个完全为您准备好的 EntityManagerFactory 服务。部署者可以使用 Config Admin、连接池、另一个 JPA 提供者等调整各种设置。这是一个明确的关注点分离。

由于不知道这个东西来自哪里以及谁实现它,你在代码中得到的假设更少,因此你的代码更不容易出错并且更可重用。我原则上,使用 Hibernate 和 MYSQL 的事实与您的大多数代码完全无关。是的,我确实知道 JPA 和 SQL 在实践中都不是非常可移植的,但是有很多方面不知道它们之间的差异。最终由部署者负责将工作的部分组合在一起。

现在声明式服务(DS)当然是一个额外的捆绑包,但是在使用 OSGi 15 年后,我声明任何 OSGi 开发人员不使用 DS,好吧,让我不要太深入,以保持它的文明 :-) 如果我愿意早在 OSGi 之初,DS 就已经内置到框架中,它是用于编程的最低级别。

于 2013-04-18T07:32:01.530 回答