OSGi、Spring、Hibernate集成:動態註冊實體類

  網上提供的關於在OSGi環境下的集成Spring、Hibernat的方案總是存在以下一種或多種問題:

  1、不能提供多個SessionFactory的統一管理

  2、不能提供實體類的動態註冊

  3、不方便測試

  4、平臺依賴度高

  先看看我提供的解決方案中各Bundle之間的關係圖:

  

  從上圖可看出,業務實體與業務邏輯Bundle是獨立自然的,不需要象某些解決方案把實體類作爲Hibernate的Fragment。實際上,本解決方案中完全可以不將實體類在META-INF.MF文件中Export.

  解決思路:

  1、org.span.orm中定義SessionFactoryService接口並提供其抽象實現,由org.span.orm.hibernate來實現這個接口。

  2、在會話工廠服務定義Bundle中通過org.span.orm和org.span.hibernate提供的類,定義SessionFactoryService服務的配置,並註冊爲SessionFactoryService服務。

  3、在業務實體與業務邏輯Bundle中,註冊實體類時,首先從SessionFactoryService服務中得到相關SessionFactory的配置,通過此配置來構造一個包括了它註冊的實體類的SessionFactory,再將其中的實體類關係合併到SessionFactoryService實現中的SessionFactory中。這其中因org.hibernate.impl.SessionFactoryImpl中所有的實體映射關係是保存到一些不可修改的final Map對象中,因此只能通過訪問私有成員變量的方式去合併兩個SessionFactoryImpl.

     方案特性:

  每個業務實體與業務邏輯Bundle是獨立自然的

  通過SessionFactoryService服務對所有會話工廠統一管理。

  在SessionFactoryService服務中使用內置HSQLDB爲每個SessionFactory(根據名稱區別)提供默認的會話工廠(使用內存數據庫或文件數據庫),方便測試。

  方案不依賴特定OSGi平臺。

 

  源代碼、文檔及Bundle下載:http://download.csdn.net/source/2406756

  測試環境:equinox3.5.2。其它用到的Bundle包括hibernate、hibernate-annotation、hsqldb、spring、spring-osgi等。請到http://www.springsource.com/repository/下載。

      注:使用前請在OSGi的啓動目錄下建立目錄logs/jta目錄。在spring dm2下使用,需要先修改config/com.springsource.kernel.userregion.properties文件,在packageImports=後加入javax.naming.*,還需要安裝spring-osgi 2.0.0 M1相關Bundle.

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章