首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

Spring、OSGi调整Hibernate 二

2012-11-05 
Spring、OSGi整合Hibernate 二接上文,为了测试已经搭好的架子,创建了一个注册实体的Bundle(wanged_security

Spring、OSGi整合Hibernate 二
接上文,为了测试已经搭好的架子,创建了一个注册实体的Bundle(wanged_security_entity),这个里面包含了两个实体类(Role、User)和它们的Hibernate映射文件(Role.hbm.xml、User.hbm.xml),以及一个实现了EntityRegister接口的类(SecurityEntityRegisterImpl)以提供注册实体的服务。这里仅将SecurityEntityRegisterImpl的代码列出如下:
?????? 现在有了实体类,就需要有对实体类进行CURD操作的Bundle(wanged_security_service),这个Bundle中采用了常见的Service-DAO模式,以对Role的操作为例,包括RoleService:
声明的服务sessionFactory和txManager,这个txManager是一个默认的事务管理方案,如果不合适可以在这个xml文件中自定义,这就为新扩展的数据库操作提供了方便。另外这里有一个测试类RoleServiceTest,是用来测试这个Bundle是否能正常工作的,可以自己编写其中的代码。
服务的声明和引用定义在osgi-service.xml文件中:
xml 代码?

  1. <osgi:reference?id="sessionFactory"?interface="org.hibernate.SessionFactory"?/>????
  2. ??
  3. <osgi:reference?interface="org.springframework.transaction.PlatformTransactionManager"?id="txManager"?/>????
  4. ??
  5. <osgi:service?interface="wanged.security.service.RoleService"?ref="roleService"?/>??
这里声明了一个RoleService的服务供其它的Bundle使用。
?????? 到目前为止,OSGi、Spring、Hibernate已经成功整合在一起。经运行测试,一切正常。但还没有对SessionFactory的重新初始化进行处理,不过这已经不是重点了。
??? ?? 后续博客会将对Jetty和Wicket的整合陆续写出来,最终形成OSGi、Spring、Hibernate、Jetty和Wicket搭建起来的面向服务的基于组件的体系。
?????? 这个周末所有的时间都放在Wicket和Jetty上面终于将其调试通过,写出来希望能给广大道友一点帮助,不至于像我刚开始那样盲目与不知所措。 1 楼 tilan 2007-08-13   不错哦



==========================
http://www.sqlsoft.com.cn
http://bbs.sqlsoft.com.cn 2 楼 shaucle 2007-08-13   事情往往就是这么变复杂的...

3 楼 earls 2007-08-14   复杂的背后带来的是良好的扩展性和动态拔插的方便性,那么这点复杂是可以接受的。
何况对于大的项目来说,这恰恰可以降低系统复杂度和耦合度。 4 楼 xsl 2007-08-14       感觉Eclipse-RegisterBuddy很可能被引入下一版的osgi标准。据说会变成Bundle-RegisterBuddy。到时改一下名称就行了。
    当然你改写SessionFactory也不错。不过能有一种不需要对现有第三方类库进行修改的实现方式应该更好,而且省力。
    在osgi专家组中也讨论过关于classloader相关的问题,有很多人呼吁在接下来的标准中应该提出官方解决方案,来解决类似Class.forName()调用的问题。但是到目前为止,除了Buddy方式还没有其它好的通用解决方式。所以,感觉Eclipse-RegisterBuddy很有可能会被采纳,进入下一版标准。 5 楼 shaucle 2007-08-15   jsr277,299,316,osgi ... 6 楼 youngliuus 2007-10-18   hi
  我也在做类似的事情,但是碰到了class loading的问题,后面附上了Configuration.buildSessionFactory时的exception.
  从异常的信息看来,hibernate在buildSessionFactory时会用hibernate的ReflectHelper做一下Class.forName.
虽然我没想明白我已经把实体的class已经给了configuration他还要再load一次,但这样就有一个问题,以你的例子来说,在wanged_core_persistent_entity_register这个bundle中要做Class.forName,那么这个bundle的classloader就要加载在其它bundle中的实体类的.
但我又没看到你有提到要在wanged_core_persistent_entity_register这个bundle中import实体类的package之类的动作,所以不太明白在你的例子是怎么工作的,能否从原理上解释一下,多谢.

org.hibernate.MappingException: entity class not found: bo.impl.ProjectImpl
at org.hibernate.mapping.PersistentClass.getMappedClass(PersistentClass.java:99)
at org.hibernate.tuple.PropertyFactory.getGetter(PropertyFactory.java:168)
at org.hibernate.tuple.PropertyFactory.buildIdentifierProperty(PropertyFactory.java:44)
at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:123)
at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:434)
at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:109)
at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:226)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:915)
Caused by: java.lang.ClassNotFoundException: bo.impl.ProjectImpl
at org.knopflerfish.framework.BundleClassLoader.findClass(BundleClassLoader.java:231)
at org.knopflerfish.framework.BundleClassLoader.loadClass(BundleClassLoader.java:299)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:100)
at org.hibernate.mapping.PersistentClass.getMappedClass(PersistentClass.java:96)
... 31 more 7 楼 earls 2007-10-20   OSGi的配置中有一个DynamicImport-Pagecke标签,可以动态引入自己需要的类,对Class.forName()尤其有效,可以设置成DynamicImport-Pagecke: *表示动态导入所有需要的。当然目前这种实现是我在最初尝试的时候采用的方法,很不完善。我现在使用的方法是采用fragment,用一个Bundle来注册所有已知的实体类,扩展的实体类通过fragment方式引入 8 楼 youngliuus 2007-10-20   非常感谢你的答复!
我后来在blueDavy写的osgi进阶中也看到了。
之前我也知道有dynamicImport,但没想到还可以写*,嘿嘿 看来不看osgi spec就是不行。

我倒是觉得import*挺自然的,如果用fragment会有些限制,比如bundle不能有自己的Activator,还和fragment host用一个classloader,这个bundle就只能提供实体了,要提供其它的服务就不太方便了。我感觉这样bundle的粒度是不是太小了。 9 楼 earls 2007-10-23   我觉得fragment主要用来解决本地化问题和一些不涉及对外提供服务的扩展问题。目前OSGi还是不够成熟,支持的第三方软件也不是太多,文档也不齐全,所以学习曲线有点陡。 10 楼 fangzhouxing 2007-10-31   引用目前OSGi还是不够成熟,支持的第三方软件也不是太多,文档也不齐全,所以学习曲线有点陡。

是啊,blueDavy的文档起到很好的作用。但是,一开始学习好像又太高深了。能否提供一些基础性的东西,先让读者入门和搭好开发调试环境,再进入具体的项目开发。 11 楼 BlueDavy 2007-11-03   基础的学习请先参考《OSGi实战》Opendoc,是入门级的,可以从blog.bluedavy.cn上下载。 12 楼 jori 2012-03-22   有源码吗
13 楼 fr_lsl 2012-04-28   注册实体的Bundle(wanged_security_entity),这个怎么做到动态注册实体? 14 楼 liuqiao_0702 2012-06-15   写的很好,有个问题请教一下:自己写的数据库bundle用到的org.hibernate.SessionFactory是怎么引进到本bundle的?以及它依赖的jar,都得引到数据库bundle中吗?相当于基础bundle和数据库bundle引用了相同的jar在自己的bundle,有没有更好的处理方式? 15 楼 KKBB123 2012-08-22   能不能 给我发份源码 我一直调试不 成功 ,你要在 发一份 先谢了

热点排行