使用带或不带OSGi的JPA之间的区别

ciste 发布于 2019-03-09 jpa 最后更新 2019-03-09 14:39 5 浏览

我是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文件? 我在这里发现了很多关于这个话题的讨论不过,我仍然遇到麻烦 谢谢
已邀请:

hquia

赞同来自:

OSGi是关于服务和服务非常容易在OSGi中使用正确的设置消费。您展示了一个带有服务引用的非常旧的样式示例,我同意,在该模型中,使用旧式JPA方式要容易得多。 但是,如果使用Declarative Services,则使用服务变得非常轻量级。您将获得一个完全为您准备的EntityManagerFactory服务。部署人员可以使用Config Admin,连接池,另一个JPA提供商等调整各种设置。这是一个明确的关注点分离。 通过不知道这个东西来自何处以及实现它的人,您在代码中得到的假设更少,因此您的代码将更不容易出错且更可重用。我的原则是,使用Hibernate和MYSQL与大多数代码完全无关。是的,我知道JPA和SQL在实践中都不是非常便携,但有很多方面都不知道这些差异。然后是部署者负责将部分工作组合在一起。 现在声明性服务(DS)当然是一个额外的捆绑包但是在使用OSGi 15年之后我现在声明任何OSGi开发人员都不使用DS,好吧,让我不要太深入了解它以保持民用:-)如果我会回到OSGi的开头,DS会被构建到框架中,它是用于编程的最低级别。