2013-04-11 53 views
2

我是OSGi的初学者,我的项目包括开发和执行,在OSGi容器(apache felix;可分发的jar),持久性包(使用jpa),然后与数据库(MySql)通过jpa提供程序(Hibernate)。
我读了关于OSGi的jpa规范,所以,如果我已经正确理解,我必须使用JPA提供程序来实现OSGI jpa企业规范的OSGi。这jpa提供程序将跟踪一个注册的持久性包为它做一个EntityManagerFactory?使用JPA与OSGi或不使用JPA的区别

那么究竟是什么,直接使用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,以便可以将其声明为“provider”我的persistence.xml文件?

我在这里发现了很多关于这个主题的讨论。我仍然有问题,但

感谢

回答

3

OSGi是关于服务和服务是非常容易在OSGi的消耗与适当的设置。您将展示一个带有服务引用的非常古老的示例,我同意,在该模型中,使用旧式的JPA方式会更容易。

但是,如果您使用声明式服务,则使用服务变得非常轻便。您可以注入一个完全为您准备的EntityManagerFactory服务。部署人员可以通过配置管理员,连接池,另一个JPA提供商等调整各种设置。这是一个明显的问题分离。

通过不真正知道这个东西来自哪里以及谁实现它,你在你的代码中得到的假设更少,因此你的代码将不易出错并且更加可重用。我的原则是,使用Hibernate和MYSQL与大部分代码完全无关。是的,我知道JPA和SQL在实践中都不是非常便于携带,但有许多方面都不了解这些差异。然后,最终负责将部署工作的部分放在一起,这是部署者。

现在声明式服务(DS)当然是一个额外的包,但在使用OSGi 15年后,现在我声明任何OSGi开发人员不使用DS,好吧,让我不要太深入,以保持它的公民性:-)如果我会回到OSGi的开始,那么DS将会被嵌入到框架中,这是最低层次的编程。