在企业应用中,持久化无疑是其中非常重要的一环,尽管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框架等等的时候都是会碰到的,这也反应了传统的开源框架在对于这种真正模块化的方式上的支撑仍然是非常不够的,传统的开源框架更多的停留于概念上的模块化。