在有或没有 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