在有或没有 OSGi 的情况下使用 JPA 的区别

Posted

技术标签:

【中文标题】在有或没有 OSGi 的情况下使用 JPA 的区别【英文标题】:Difference between using JPA with or without OSGi 【发布时间】:2013-04-03 23:08:16 【问题描述】:

我是 OSGi 的初学者,我的项目包括在 OSGi 容器(apache felix;可分发 jar)中开发和执行持久性捆绑包(使用 jpa),然后通过 jpa 与数据库(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 以将其声明为“提供者”在我的 persistence.xml 文件中?

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

谢谢

【问题讨论】:

【参考方案1】:

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

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

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

现在声明式服务 (DS) 当然是一个额外的捆绑包,但是在使用 OSGi 15 年后,我声明任何 OSGi 开发人员都没有使用 DS,好吧,让我不要深入探讨它以保持其文明 :-) 如果我会回到 OSGi 的开始,DS 会被内置到框架中,它是用于编程的最低级别。

【讨论】:

以上是关于在有或没有 OSGi 的情况下使用 JPA 的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何在有或没有 SIMD 内在函数的情况下从 Zig 构建和链接到 CGLM

php 用户在有或没有 AJAX 的情况下注销

网站网址可以在有或没有 index.php 的情况下访问 [重复]

将多个域重定向到一个域(之前有或没有 www)

非同步线程和同步线程的区别[重复]

JPA 与 OSGi 示例在 serviceReference 中返回 null