2013-04-11 13 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將會被嵌入到框架中,這是最低層次的編程。