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

时间:2013-04-11 16:32:06

标签: jpa osgi

我是OSGi的初学者,我的项目包括在OSGi容器(apache felix;可分发jar)中的开发和执行,持久性包(使用jpa),然后通过jpa与数据库(MySql)通信提供者(Hibernate) 我读到了OSGi的jpa规范,所以,如果我已经正确理解,我必须使用JPA提供程序来实现OSGI jpa企业规范的OSGi。这个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 个答案:

答案 0 :(得分:3)

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

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

通过不知道这个东西来自何处以及实现它的人,您在代码中得到的假设更少,因此您的代码将更不容易出错且更可重用。我的原则是,使用Hibernate和MYSQL与大多数代码完全无关。是的,我知道JPA和SQL在实践中都不是非常便携,但有很多方面都不知道差异。然后是部署者负责将部分工作放在一起。

现在声明服务(DS)当然是一个额外的捆绑包但是在使用OSGi 15年之后我现在声明任何OSGi开发人员都不使用DS,好吧,让我不要太深入了解它以保持民用:-)如果我会回到OSGi的开头,DS会被构建到框架中,它是用于编程的最低级别。