OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇
在企業(yè)應(yīng)用中,持久化無(wú)疑是其中非常重要的一環(huán),盡管OSGi的規(guī)范中也有負(fù)責(zé)持久數(shù)據(jù)、屬性的服務(wù)規(guī)范,但對(duì)于企業(yè)應(yīng)用而言那些顯然是不夠的,這里就以目前Java界流行的Hibernate為例來(lái)看看如何集成Hibernate到OSGi中,使得我們能夠很簡(jiǎn)單在OSGi中使用Hibernate進(jìn)行持久化。
首先來(lái)看看在傳統(tǒng)的Java應(yīng)用中,是如何使用Hibernate的,在不使用類似spring ORM Template這些封裝了Hibernate東西的情況下,通常都是對(duì)外提供一個(gè)公共的封裝了通用操作的Dao類,方便其他的Dao或者Service直接使用,在集成到OSGi中仍然希望是如此,那么這步怎么做呢?
非常的簡(jiǎn)單,在Eclipse中新建一個(gè)Plugin Project,然后把Hibernate所需要的lib放入project的lib中,將在傳統(tǒng)Java應(yīng)用中的象HibernateUtil、CommonDao這些類直接copy到當(dāng)前project中,CommonDao是需要暴露給其他的Plugin project使用的,這里就需要將CommonDao的package加入到Project的export-package描述中了,接下來(lái)就是基于DS的方式對(duì)外提供CommonDao服務(wù)。
通過上面這樣的方法就已經(jīng)可以在基于OSGi的應(yīng)用中使用CommonDao來(lái)完成持久化層的操作了,但這時(shí)會(huì)發(fā)現(xiàn)有個(gè)問題,在HibernateUtil這樣的提供session管理的類中通常需要指定hibernatecfg.xml的位置,那么按照上面的做法自然是只能在上面的plugin project中放置這個(gè)文件了,在這個(gè)文件中配置了需要加載的po的映射文件,這樣呢,就使得目前基于OSGi的應(yīng)用需要將系統(tǒng)中所有的持久PO都放入這個(gè)Project中,而不是放入各自獨(dú)立的Plugin Project中,而Dao則可以放到各自獨(dú)立的Plugin Project中去,基于這樣的方法,就構(gòu)成了在基于OSGi的應(yīng)用中通常是如下的方式:
還有一個(gè)方法就是每個(gè)Plugin Project維護(hù)自己的hibernate.cfg.xml,這樣各自的po也就可以放在各自獨(dú)立的Plugin project中,但這樣的方法帶來(lái)的問題就是各個(gè)Plugin project都會(huì)產(chǎn)生一個(gè)Hibernate SessionFactory,而且當(dāng)系統(tǒng)的持久模型較為復(fù)雜的時(shí)候就更麻煩了,一個(gè)PO需要存在在幾個(gè)Plugin Project中的時(shí)候,那樣就會(huì)出現(xiàn)session中數(shù)據(jù)不一致的現(xiàn)象,所以暫時(shí)不去采用這種方法。
當(dāng)然,相信將來(lái)會(huì)有更好的方式,需要解決的主要是統(tǒng)一加載各plugin project中的映射文件、PO的加載,在目前的情況下,要形成一個(gè)對(duì)外封閉的通用Hibernate Plugin Project還是很麻煩的,這種現(xiàn)象在集成MVC框架等等的時(shí)候都是會(huì)碰到的,這也反應(yīng)了傳統(tǒng)的開源框架在對(duì)于這種真正模塊化的方式上的支撐仍然是非常不夠的,傳統(tǒng)的開源框架更多的停留于概念上的模塊化。
posted on 2006-09-26 00:32 BlueDavy 閱讀(4511) 評(píng)論(12) 編輯 收藏 所屬分類: OSGi、SOA、SCA