在企業應用中,持久化無疑是其中非常重要的一環,盡管OSGi的規范中也有負責持久數據、屬性的服務規范,但對于企業應用而言那些顯然是不夠的,這里就以目前Java界流行的Hibernate為例來看看如何集成Hibernate到OSGi中,使得我們能夠很簡單在OSGi中使用Hibernate進行持久化。
首先來看看在傳統的Java應用中,是如何使用Hibernate的,在不使用類似spring ORM Template這些封裝了Hibernate東西的情況下,通常都是對外提供一個公共的封裝了通用操作的Dao類,方便其他的Dao或者Service直接使用,在集成到OSGi中仍然希望是如此,那么這步怎么做呢?
非常的簡單,在Eclipse中新建一個Plugin Project,然后把Hibernate所需要的lib放入project的lib中,將在傳統Java應用中的象HibernateUtil、CommonDao這些類直接copy到當前project中,CommonDao是需要暴露給其他的Plugin project使用的,這里就需要將CommonDao的package加入到Project的export-package描述中了,接下來就是基于DS的方式對外提供CommonDao服務。
通過上面這樣的方法就已經可以在基于OSGi的應用中使用CommonDao來完成持久化層的操作了,但這時會發現有個問題,在HibernateUtil這樣的提供session管理的類中通常需要指定hibernatecfg.xml的位置,那么按照上面的做法自然是只能在上面的plugin project中放置這個文件了,在這個文件中配置了需要加載的po的映射文件,這樣呢,就使得目前基于OSGi的應用需要將系統中所有的持久PO都放入這個Project中,而不是放入各自獨立的Plugin Project中,而Dao則可以放到各自獨立的Plugin Project中去,基于這樣的方法,就構成了在基于OSGi的應用中通常是如下的方式:

還有一個方法就是每個Plugin Project維護自己的hibernate.cfg.xml,這樣各自的po也就可以放在各自獨立的Plugin project中,但這樣的方法帶來的問題就是各個Plugin project都會產生一個Hibernate SessionFactory,而且當系統的持久模型較為復雜的時候就更麻煩了,一個PO需要存在在幾個Plugin Project中的時候,那樣就會出現session中數據不一致的現象,所以暫時不去采用這種方法。
當然,相信將來會有更好的方式,需要解決的主要是統一加載各plugin project中的映射文件、PO的加載,在目前的情況下,要形成一個對外封閉的通用Hibernate Plugin Project還是很麻煩的,這種現象在集成MVC框架等等的時候都是會碰到的,這也反應了傳統的開源框架在對于這種真正模塊化的方式上的支撐仍然是非常不夠的,傳統的開源框架更多的停留于概念上的模塊化。