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

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