OSGi应用于企业应用Step by step之持久篇

在企业应用中,持久化无疑是其中非常重要的一环,尽管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的应用中通常是如下的方式:
Hibernate Bundle.png
还有一个方法就是每个Plugin Project维护自己的hibernate.cfg.xml,这样各自的po也就可以放在各自独立的Plugin project中,但这样的方法带来的问题就是各个Plugin project都会产生一个Hibernate SessionFactory,而且当系统的持久模型较为复杂的时候就更麻烦了,一个PO需要存在在几个Plugin Project中的时候,那样就会出现session中数据不一致的现象,所以暂时不去采用这种方法。
当然,相信将来会有更好的方式,需要解决的主要是统一加载各plugin project中的映射文件、PO的加载,在目前的情况下,要形成一个对外封闭的通用Hibernate Plugin Project还是很麻烦的,这种现象在集成MVC框架等等的时候都是会碰到的,这也反应了传统的开源框架在对于这种真正模块化的方式上的支撑仍然是非常不够的,传统的开源框架更多的停留于概念上的模块化。

posted on 2006-09-26 00:32 BlueDavy 阅读(4500) 评论(12)  编辑  收藏 所属分类: OSGi、SOA、SCA

评论

# re: OSGi应用于企业应用Step by step之持久篇 2006-09-26 08:29 坏男孩

顶一下,有没有小例子!写文档的时候用画图的方式很好  回复  更多评论   

# re: OSGi应用于企业应用Step by step之持久篇 2006-09-26 09:18 蚂蚱

我觉得将所有PO和影射文件放入一个bundle有些不妥。而应该使用类似于Http Service的设计思路,将影射文件或hibernatecfg.xml注册到一个统一的Hibernate Service 中,但我还没有细想,如果有时间我会仔细考虑一下,写个blog与大家共享。  回复  更多评论   

# re: OSGi应用于企业应用Step by step之持久篇 2006-09-26 14:26 BlueDavy

@蚂蚱
如果只是hibernate.cfg.xml的问题就好办了,你有没有考虑如果po放在各自bundle的时候那怎么去加载那些po呢,固然,不要忘了在OSGi中bundle中的类是独立加载的,这个和传统模式是完全不一样的。
不过你说的用统一的Hibernate Service的方法确实是可以的,不过要基于Hibernate做出一些改动,特别是在加载po class以及映射文件方面。
其实对于采用分层开发的团队来讲这不是问题。  回复  更多评论   

# re: OSGi应用于企业应用Step by step之持久篇 2006-09-27 20:38 deardream

不知道OSGI能否处理Hibernate中一个很麻烦的问题:动态属性变化?

运行期给某个PO类添加一个property,级联的在某表中增加一个字段。。。

以前似乎是比较麻烦,除非自己弄个classLoader,现在通过OSGI是否能解决这个问题?  回复  更多评论   

# re: OSGi应用于企业应用Step by step之持久篇 2006-09-27 20:43 BlueDavy

@deardream
...这个和是否使用OSGi没关系,是Hibernate本身的问题...
当然,我们可以在OSGi+Hibernate的基础上做个扩展来支持这样的动态性。  回复  更多评论   

# re: OSGi应用于企业应用Step by step之持久篇 2006-09-28 11:43 deardream

这确实是Hibernate的问题,Hibernate也给出了Dynamic Model来解决这个问题,但是Dynamic Model就破坏了面向对象的很多优势(聚合、继承),而如果用静态对象的手段,又面向动态属性变化的问题。

我期望的是依赖OSGI来解决运行期对象动态改变和加载的问题。  回复  更多评论   

# re: OSGi应用于企业应用Step by step之持久篇 2006-09-28 12:30 BlueDavy

@deardream
嗯,没错,可以基于OSGi的思想做个Hibernate的扩展..
  回复  更多评论   

# re: OSGi应用于企业应用Step by step之持久篇 2006-09-28 13:06 guitarpoet

OSGI的环境就是一个非常经典的SOA环境,把思路限制在O/R Mapping身上就错了。

完全可以采用别的方式,我举两个:

1、采用ActiveRecord模式,中间需要一个从Domain Object到Active Record的数据迁移。
2、采用AOP的模式,在持久化操作时给Domain Object mixin持久化操作。

有趣的是OSGI只知道你是Service,根本不会管你到底是什么。那么,就可以让脚本语言出马啦。

如果再结合Annotation,可以实现脚本动态交织,能达到的效果是不可想象的。更有趣的是,这样在理论上并不会比Hibernate的动态解析HQL然后生成SQL效率低。而且,我个人觉得用MixIn的方式更面向对象。

我现在就有这样作的打算,我的初步想法是通过JRuby和OSGI把ActiveRecord这种模式以Service的方式实现,有想法的话可以跟我讨论。
Mail: guitarpoet@gmail.com  回复  更多评论   

# re: OSGi应用于企业应用Step by step之持久篇 2006-09-28 13:38 蚂蚱

@BlueDavy

我想过这个问题,但是Httpservice中注册的Servlet不也是在其他bundle中吗。是否因为Httpservice是系统服务,所以他可以调用其他bundle中的servlet和相关类。由于是从你的系列文章中学的osgi,研究不深,还请多多指教。  回复  更多评论   

# re: OSGi应用于企业应用Step by step之持久篇 2006-09-28 16:09 BlueDavy

@guitarpoet
...我没有说仅限于O/R Mapping,只是以Hibernate来举个例子而已....
每个公司都有其稳定的一种持久的方案,总不能强制别人用Hibernate的就一定要用你的方案呀...

@蚂蚱
...HttpService的处理机制不同,因为在注册servlet时是直接把servlet实例给注册过去的,而在Hibernate那边则不能这样...  回复  更多评论   

# re: OSGi应用于企业应用Step by step之持久篇 2006-11-08 15:46 生与夏花

如果借用Equniox的强大的扩展点机制是不是可以容易点。
1 。修改hibernate的配置文件加载机制,让他从registry中动态的加载配置.
2 。修改hiberante的hibernate.cfg.xml配置文件加载机制让他可以从Config Admin中存取做到动态的配置。
3 。修改equniox的classLoader加载机制,让他可以从client端的bundler中加载类或者文件。这个可以参考spring-osgi中的classLoader加载机制。
4 。这样就可以以模块化的方法进行设计hibernate,每个domain对象和对应的映射文件都可以放在独立的bundler中,把这个bundler作为第一部中hibernate的Extension points加以配置。
注:如果不想利用equniox的扩展点机制,可以使用 “BlueDavy ”在他blog中提到的可以自己实现一个扩展点模型的实现。
这个实现如果是jboss的事项者来做应该是很简单的,如果是个人拿就得研究一下hibernate的原代码了,但是也不用全研究制止配置部分。

  回复  更多评论   

# re: OSGi应用于企业应用Step by step之持久篇 2006-11-08 17:23 BlueDavy

@生与夏花
嗯,没错,做法确实差不多是这样..
不过既然现在spring & osgi要出来了,可以看看是不是可以直接用
  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

公告

 









feedsky
抓虾
google reader
鲜果

导航

<2006年9月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

随笔分类

随笔档案

文章档案

Blogger's

搜索

最新评论

阅读排行榜

评论排行榜