`
earls
  • 浏览: 69888 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring、OSGi整合Hibernate 二

阅读更多
接上文,为了测试已经搭好的架子,创建了一个注册实体的Bundle(wanged_security_entity),这个里面包含了两个实体类(Role、User)和它们的Hibernate映射文件(Role.hbm.xml、User.hbm.xml),以及一个实现了EntityRegister接口的类(SecurityEntityRegisterImpl)以提供注册实体的服务。这里仅将SecurityEntityRegisterImpl的代码列出如下:
java 代码
 
  1. package wanged.security.entity;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import wanged.core.persistent.entity.EntityRegister;  
  6.   
  7.   
  8. @SuppressWarnings("unchecked")  
  9. public class SecurityEntityRegisterImpl implements EntityRegister{  
  10.   
  11.     public Class[] register() {  
  12.         ArrayList<class> cList = new ArrayList<class>();  </class></class>
  13.          
  14.         cList.add(Role.class);  
  15.         cList.add(User.class);  
  16.           
  17.         return cList.toArray(new Class[cList.size()]);  
  18.     }  
  19.   
  20. }  
下面来声明该服务:
xml 代码
 
  1. <osgi:service interface="wanged.core.persistent.entity.EntityRegister">      
  2.   <bean class="wanged.security.entity.SecurityEntityRegisterImpl" />      
  3. </osgi:service>  
 这个服务就是上篇中,"wanged_core_persistent" Bundle中引用的服务,完成了实体类的注册。
       现在有了实体类,就需要有对实体类进行CURD操作的Bundle(wanged_security_service),这个Bundle中采用了常见的Service-DAO模式,以对Role的操作为例,包括RoleService:
java 代码
 
  1. package wanged.security.service;  
  2.   
  3. import java.util.List;  
  4.   
  5. import wanged.security.dao.RoleDao;  
  6. import wanged.security.entity.Role;  
  7.   
  8. public interface RoleService {  
  9.   
  10.     void setRoleDao(RoleDao rdao);  
  11.       
  12.     void saveRole(Role r);  
  13.       
  14.     List<role> findAll();  </role>
  15. }  
和其实现RoleServiceImpl:
java 代码
 
  1. package wanged.security.service.impl;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.springframework.transaction.annotation.Propagation;  
  6. import org.springframework.transaction.annotation.Transactional;  
  7.   
  8. import wanged.security.dao.RoleDao;  
  9. import wanged.security.entity.Role;  
  10. import wanged.security.service.RoleService;  
  11.   
  12. @Transactional(readOnly = true)  
  13. public class RoleServiceImpl implements RoleService {  
  14.   
  15.     private RoleDao rdao;  
  16.   
  17.     public void setRoleDao(RoleDao rdao) {  
  18.         this.rdao = rdao;  
  19.     }  
  20.       
  21.     @Transactional(readOnly = false, propagation = Propagation.REQUIRED)  
  22.     public void saveRole(Role r) {  
  23.         this.rdao.save(r);  
  24.     }  
  25.   
  26.     @Transactional()  
  27.     public List<role> findAll() {  </role>
  28.         List<role> l =  this.rdao.find();  </role>
  29.         return l;  
  30.     }  
  31.       
  32. }  
以及DAO的接口RoleDao:
java 代码
 
  1. package wanged.security.dao;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.hibernate.SessionFactory;  
  6.   
  7. import wanged.security.entity.Role;  
  8.   
  9. public interface RoleDao {  
  10.   
  11.     void setSessionFactory(SessionFactory sessionFactory);  
  12.   
  13.     void save(Role r);  
  14.   
  15.     List<role> find();  </role>
  16. }  
及其实现RoleDaoImpl:
java 代码
 
  1. package wanged.security.dao.impl;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.hibernate.SessionFactory;  
  6.   
  7. import wanged.security.dao.RoleDao;  
  8. import wanged.security.entity.Role;  
  9.   
  10. public class RoleDaoImpl implements RoleDao {  
  11.     private SessionFactory sessionFactory;  
  12.   
  13.     public void setSessionFactory(SessionFactory sessionFactory) {  
  14.         this.sessionFactory = sessionFactory;  
  15.     }  
  16.   
  17.     public void save(Role r) {  
  18.         sessionFactory.getCurrentSession().save(r);  
  19.     }  
  20.       
  21.     @SuppressWarnings("unchecked")  
  22.     public List<role> find(){  </role>
  23.         return sessionFactory.getCurrentSession().createQuery("from " + Role.class.getName()).list();  
  24.     }  
  25. }  
这些都是最常见的没什么可注意的,下面主要说说配置。
配置文件还是Bean初始化使用bean.xml:
xml 代码
 
  1. <!-- 数据持久化 -->  
  2. <bean id="roleDao" class="wanged.security.dao.impl.RoleDaoImpl">  
  3.   <property name="sessionFactory" ref="sessionFactory" />  
  4. </bean>  
  5.   
  6. <bean id="roleService" class="wanged.security.service.impl.RoleServiceImpl">  
  7.   <property name="roleDao" ref="roleDao" />  
  8. </bean>  
  9.   
  10. <!-- 事务处理 -->  
  11. <tx:annotation-driven transaction-manager="txManager" />  
  12.   
  13. <!--  Test  -->  
  14. <bean id="test" class="wanged.RoleServiceTest" init-method="init">  
  15.   <property name="roleService" ref="roleService" />  
  16. </bean>  

这里引用了上文中在"wanged_core_persistent" Bundle中声明的服务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上面终于将其调试通过,写出来希望能给广大道友一点帮助,不至于像我刚开始那样盲目与不知所措。
分享到:
评论
15 楼 KKBB123 2012-08-22  
能不能 给我发份源码 我一直调试不 成功 ,你要在 发一份 先谢了
14 楼 liuqiao_0702 2012-06-15  
写的很好,有个问题请教一下:自己写的数据库bundle用到的org.hibernate.SessionFactory是怎么引进到本bundle的?以及它依赖的jar,都得引到数据库bundle中吗?相当于基础bundle和数据库bundle引用了相同的jar在自己的bundle,有没有更好的处理方式?
13 楼 fr_lsl 2012-04-28  
注册实体的Bundle(wanged_security_entity),这个怎么做到动态注册实体?
12 楼 jori 2012-03-22  
有源码吗
11 楼 BlueDavy 2007-11-03  
基础的学习请先参考《OSGi实战》Opendoc,是入门级的,可以从blog.bluedavy.cn上下载。
10 楼 fangzhouxing 2007-10-31  
引用
目前OSGi还是不够成熟,支持的第三方软件也不是太多,文档也不齐全,所以学习曲线有点陡。


是啊,blueDavy的文档起到很好的作用。但是,一开始学习好像又太高深了。能否提供一些基础性的东西,先让读者入门和搭好开发调试环境,再进入具体的项目开发。
9 楼 earls 2007-10-23  
我觉得fragment主要用来解决本地化问题和一些不涉及对外提供服务的扩展问题。目前OSGi还是不够成熟,支持的第三方软件也不是太多,文档也不齐全,所以学习曲线有点陡。
8 楼 youngliuus 2007-10-20  
非常感谢你的答复!
我后来在blueDavy写的osgi进阶中也看到了。
之前我也知道有dynamicImport,但没想到还可以写*,嘿嘿 看来不看osgi spec就是不行。

我倒是觉得import*挺自然的,如果用fragment会有些限制,比如bundle不能有自己的Activator,还和fragment host用一个classloader,这个bundle就只能提供实体了,要提供其它的服务就不太方便了。我感觉这样bundle的粒度是不是太小了。
7 楼 earls 2007-10-20  
OSGi的配置中有一个DynamicImport-Pagecke标签,可以动态引入自己需要的类,对Class.forName()尤其有效,可以设置成DynamicImport-Pagecke: *表示动态导入所有需要的。当然目前这种实现是我在最初尝试的时候采用的方法,很不完善。我现在使用的方法是采用fragment,用一个Bundle来注册所有已知的实体类,扩展的实体类通过fragment方式引入
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
5 楼 shaucle 2007-08-15  
jsr277,299,316,osgi ...
4 楼 xsl 2007-08-14  
    感觉Eclipse-RegisterBuddy很可能被引入下一版的osgi标准。据说会变成Bundle-RegisterBuddy。到时改一下名称就行了。
    当然你改写SessionFactory也不错。不过能有一种不需要对现有第三方类库进行修改的实现方式应该更好,而且省力。
    在osgi专家组中也讨论过关于classloader相关的问题,有很多人呼吁在接下来的标准中应该提出官方解决方案,来解决类似Class.forName()调用的问题。但是到目前为止,除了Buddy方式还没有其它好的通用解决方式。所以,感觉Eclipse-RegisterBuddy很有可能会被采纳,进入下一版标准。
3 楼 earls 2007-08-14  
复杂的背后带来的是良好的扩展性和动态拔插的方便性,那么这点复杂是可以接受的。
何况对于大的项目来说,这恰恰可以降低系统复杂度和耦合度。
2 楼 shaucle 2007-08-13  
事情往往就是这么变复杂的...

1 楼 tilan 2007-08-13  
不错哦



==========================
http://www.sqlsoft.com.cn
http://bbs.sqlsoft.com.cn

相关推荐

    Eclipse RCP与Spring OSGi技术详解与最佳实践

    《Eclipse RCP与Spring OSGi:技术详解与最佳实践》由资源的Eclipse专家亲自...实战篇(第13-15章)详细讲解了Eclipse RCP与Spring OSGi框架、Hibernate ORM框架、JPA规范、Maven工具的整合,以及它与Java的模块化设计

    OSGI&spring;&hibernate;

    2. Spring在OSGI中的配置:讲解如何在OSGI中配置Spring,如使用Declarative Services(DS)声明依赖关系。 3. Hibernate在OSGI中的整合:阐述如何将Hibernate集成到OSGI环境中,包括SessionFactory和Session的管理。...

    SpringMVC+Spring+SpringDataJPA+Hibernate整合登录的效果

    这是整合SpringMVC+Spring+SpringDataJPA+Hibernate简单的实现登录的功能,用的是mysql数据库,这是一个web Project 如果你用的是JavaEE6那么你要注意bean-validator.jar和weld-osgi-bundle.jar与slf4j的jar包冲突。...

    springdm整合hibernater

    整合Hibernate则能让我们在OSGi系统中轻松地处理数据存储。 首先,整合的关键在于让Hibernate适应OSGi的动态特性。通常,Hibernate的SessionFactory是静态配置的,但在OSGi中,我们希望能够在运行时添加或移除实体...

    osgi资料

    - Spring与OSGi的整合:介绍如何在OSGi环境中使用Spring,如使用Declarative Services或Blueprint API。 - 微服务架构:讨论如何利用OSGi的模块化特性构建微服务,实现松耦合和独立部署。 - AOP在OSGi中的应用:...

    OSGi传说beta1.1.pdf

    OSGi可以与Spring框架整合,利用Spring的强大功能进行依赖注入和配置管理。 **步骤**: 1. 添加Spring DM支持库。 2. 配置Spring Bean。 3. 注册服务。 #### 十、OSGi与Hibernate框架的整合 OSGi也可以与...

    virgo+hibernate+spring+springmvc项目

    在这个项目中,Spring可能被用于管理对象的生命周期,配置事务管理,以及整合其他库(如Hibernate)。`com.yishang.helper.service`和`com.yishang.helper.service.impl`目录下的类可能代表了Spring的服务层接口和...

    Java整合SSH框架

    在Java中整合SSH(Spring + Struts2 + Hibernate)框架时,需要引入相应的jar包。以下是一些基本的jar包和它们的用途: Spring基本和IOC的jar包: org.springframework.web-x.x.x.RELEASE.jar:在web.xml中配置...

    spring 3.0 jar 所有开发包及开发项目实例

    org.springframework.orm-3.0.0.M4.jar: 整合第三方的ORM框架,如hibernate,ibatis,jdo,以及spring的JPA实现 org.springframework.transaction-3.0.0.M4.jar: 为JDBC、Hibernate、JDO、JPA等提供的一致的声明式和...

    Spring攻略(第二版 中文高清版).part2

    第2章 高级Spring IoC容器 57 2.1 调用静态工厂方法创建Bean 57 2.1.1 问题 57 2.1.2 解决方案 57 2.1.3 工作原理 57 2.2 调用一个实例工厂方法创建Bean 58 2.2.1 问题 58 2.2.2 解决方案 59 2.2.3...

    Spring攻略(第二版 中文高清版).part1

    第2章 高级Spring IoC容器 57 2.1 调用静态工厂方法创建Bean 57 2.1.1 问题 57 2.1.2 解决方案 57 2.1.3 工作原理 57 2.2 调用一个实例工厂方法创建Bean 58 2.2.1 问题 58 2.2.2 解决方案 59 2.2.3...

    研发工程师 个人简历模板.docx

    - 开发框架:Struts, Spring, Hibernate, OSGi等。 - 测试与自动化:了解自动化测试工具和方法,如JMS、Webservices等。 - 项目管理:熟悉敏捷开发流程,如Scrum或Kanban。 3. **项目经验实例** - **中科曙光云...

    关于eclipse的插件

    Eclipse插件是为Eclipse IDE添加特定功能的小型软件组件,可以是用于语法高亮、代码自动完成、调试工具,或者是针对特定技术或框架的支持,如Spring、Hibernate或是Android开发工具。它们让开发者能够定制自己的工作...

    jersey所需jar包

    Jersey 可以与 Spring、Guice 等流行的依赖注入框架集成,也可以与 Hibernate、MyBatis 等 ORM 工具结合,方便开发复杂的 Web 应用。 7. **测试支持**: `jersey-test-framework-provider-grizzly2.jar` 和 `...

    struts.zip

    Struts是Apache软件基金会(ASF)旗下的一个开源项目,它是一个用于构建企业级Java ...开发人员需熟练掌握Struts的配置、Action编写、视图渲染以及与其他技术(如Hibernate、Spring等)的整合,以确保系统的高效运行。

    eclipse从入门到精通源码eclipse从入门到精通源码

    了解如何在Eclipse中集成其他开发工具和框架,如Spring,Hibernate,或者使用Eclipse for RCP and RAP进行富客户端应用开发。 总之,"eclipse从入门到精通源码"的学习涵盖了Eclipse的基础使用、进阶技巧、源码分析...

    camel

    "java"表明Camel是用Java编写的,这意味着它能很好地融入Java生态系统,并且可以与其他Java技术(如Spring、Hibernate等)无缝配合。 "库"意味着Camel是一个可以被其他Java项目引用的库,它为开发者提供了大量的...

    java学习之路

    3. **框架整合**:如Struts2、Hibernate和Spring的集成,了解它们的工作原理和配置,这是企业级Java开发中的常见组合。 4. **反射操作**:熟练使用反射API,能够动态地创建对象、调用方法和访问字段,这对于理解和...

    eclipse插件1

    6. **第三方库支持**:插件可能包含对常用第三方库的管理,如Spring、Hibernate等,简化了库的导入和版本控制。 7. **代码质量分析**:插件可能包含静态代码分析工具,帮助检测潜在的代码问题,如潜在的空指针异常...

Global site tag (gtag.js) - Google Analytics