`

Spring与Hibernate的整合与解耦

阅读更多

     Hibernate与Spring整合后,就可以使用IoC及AOP的功能了,好处不在多言。另外一个好处,就是可以通过使用Spring的HibernateTemplate来简化数据库CRUD代码。然而,正是这个HibernateTemplate,存在着以下的缺点:

 

     1. 功能不全,不如Hibernate的储如createQuery()等方法方便、灵活与强大,使用颇受限制;


     2. HibernateTemplate中的SessionFacotry封装得太死,且session常常会自动过早关闭,使用上颇多不便;

 

 

 

     3. Spring1.2.7实际上只支持Hibernate3.0.5,HibernateTemplate无法使用Hibernate3.1以后新加的功能。

 

     正是由于这三点,使我抵制住了使用HibernateTemplate的诱惑,在将Spring与Hibernate整合后,通过简单的配置,在Spring程序中自由地使用Hibernate3.1.2的功能。这样既可以实现强强联手,又可以在Hibernate新版本出来后,马上进行重新整合,无需等着新版的Spring出来。

 

     在实现上,主要有三点:

 

     1. 在Spring的配置文件中,无需定义长长的hibernateTemplate,只需定义sessionFacotry就行了。

 

     例如,设有一"组织DaoImpl",实现了"组织Dao"及"HibernateDao"两个接口。而"组织Service"通过将"组织DaoImpl"封装起来,对外提供相应的数据库功能服务。

 

 

public interface HibernateDao {
     public void setSessionFactory(SessionFactory sessionFactory);
}

public interface 组织Dao {
     public void 增加组织(组织 组织);
     public void 删除组织(Long 组织编号);
     public 组织 get组织By名称(String 组织名称);
     ......
}

public class 组织DaoImpl implements 组织Dao, HibernateDao {
     private SessionFactory sessionFactory;

     public void setSessionFactory(SessionFactory sessionFactory) {
         this.sessionFactory = sessionFactory;
     }

     public 组织 get组织By名称(String 组织名称) {
         ......
     }
}

public interface 组织Service {
     public 组织 get组织By名称(String 组织名称);
     ......
}

 

 

 

(实际代码中,组织Service与组织DaoI的接口是一样的)

先在Spring的配置文件中定义"组织Service"与"组织Dao":

 

 <bean id="组织Service"
         class="com.sarkuya.service.组织ServiceImpl">
         <property name="组织Dao">
             <ref bean="组织Dao" />
         </property>
</bean>

<bean id="组织Dao"
         class="com.sarkuya.model.dao.hibernate.组织DaoImpl">
         <property name="sessionFactory">
             <ref bean="sessionFactory" />
         </property>
</bean>

    

 

 

 这一步比较好理解。问题是如何将我们所需的sessionFactory传过来。Hibernate的sessionFactory不是一个可以用构造方法或setter方法就可以直接生成的类,而是需要进行一定的"运算"后才得出的类,典型的形式如:

 

sessionFactory = new Configuration().buildSessionFactory();



 

因此,简单地在Spring中如下配置行不通。

    

<bean id="sessionFactory"
         class="org.hibernate.SessionFactory">
         <property name="xxx">
             <value>xxx</valu>
         </property>
</bean>

 

 

所幸,Spring提供了一种可定义由工厂方法所产生的bean的方式。

    

<bean id="sessionFactory"
         class="com.sarkuya.hibernate.util.HibernateUtil"
        factory-method="getSessionFactory" />

 

 

这种方式,当我们需要得到sessionFacotry的bean时,Spring就会从com.sarkuya.hibernate.util.HibernateUtil的getSessionFactory()方法中获得。这种方式,我们最熟悉不过了:

 

public class HibernateUtil {
     private static final SessionFactory sessionFactory;
    
     static {
         try {
             sybaseSessionFactory = new Configuration()
                 .addClass(com.sarkuya.model.cfg.hibernate.组织.class)
                 .configure("/hibernate_hsql.cfg.xml")
                 .buildSessionFactory();
         } catch (Throwable ex) {
             System.err.println("Initial SessionFactory creation failed." + ex);
             throw new ExceptionInInitializerError(ex);
         }
     }
    
     public static SessionFactory getSessionFactory() {
         return sessionFactory;
     }
}

 

好了,以上步骤,我们已经成功地将sessionFactory注入组织Dao中,再注入组织Service中,根据测试先行原则,看看如何在TestCase中获取组织Service这个bean。

 

二,在代码中获取组织Service。

 

public class 组织ServiceTest extends TestCase {
     private 组织Service 组织Service;

     protected void setUp() throws Exception {
         String[] configLocation = new String[] {
             "/web/WEB-INF/training-service.xml",
             "/web/WEB-INF/training-data.xml"
         };
         ApplicationContext ac = new FileSystemXmlApplicationContext(configLocation);
        组织Service = (组织Service)ac.getBean("组织Service");
     }

     public void testGet组织By名称() {
         System.out.println("get组织By名称");
        
         组织 组织 = 组织Service.增加组织(new 组织("aaa"));
        
         组织 = 组织Service.get组织By名称("aaa");
         assertEquals("aaa", 组织.get名称());
        
         组织 = 组织Service.get组织By名称("abc");
         assertNull(组织);
     }
}

 

 

三,组织DaoImpl的代码:

/*
      * @param 组织名称
      * @return 组织 或者 null
      */
     public 组织 get组织By名称(String 组织名称) {
         Session session = sessionFactory.getCurrentSession();
         session.beginTransaction();                             //Hiberante3.1以后的代码      
        
         组织 组织 = (组织)session.createQuery("from 组织 c where c.名称 = '" + 组织名称   + "'")
             .uniqueResult();
        
         session.getTransaction().commit();
        
         return 组织;
}

     

 

 

由上可见,Hibernate的核心代码一点未变,从而在与Spring整合的基础上,实现了与Spring的解耦。

分享到:
评论
1 楼 lbj2004032 2012-08-25  
这代码我擦

相关推荐

    Spring与Hibernate整合

    在"25_黑马程序员_黎活明_Spring2.5视频教程_搭建和配置Spring与Hibernate整合的环境.avi"这个文件中,可能详细演示了如何配置这些库到项目的类路径中。 接着,需要配置Spring的IoC容器。这可以通过XML配置文件完成...

    Spring与Hibernate整合小例子

    "Spring与Hibernate整合"是为了实现业务逻辑层和数据访问层的高效协作。整合过程通常包括以下几个步骤: 1. **引入依赖**:首先,需要在项目中添加Spring和Hibernate的相关库。这通常通过Maven或Gradle的依赖管理来...

    spring与hibernate的整合

    Spring 和 Hibernate 的整合是企业级 Java 应用开发中的常见实践,它将 Spring 框架的控制反转(IoC)和面向切面编程(AOP)优势与 Hibernate 的持久化能力相结合,提供了更高效、灵活的数据库操作。下面我们将深入...

    浅谈Spring+Hibernate整合(共16页).doc

    总之,Spring 和 Hibernate 的整合是 Java Web 开发中的常见实践,它利用 Spring 的强大管理能力和事务处理,结合 Hibernate 的 ORM 功能,简化了数据库操作和事务管理,提高了软件的可扩展性和可维护性。...

    Spring,Hibernate整合源码

    通过阅读和理解提供的"Spring,Hibernate整合源码",可以深入学习如何在实际项目中将这两个框架融合,掌握最佳实践,提高开发效率。源码分析通常涉及对配置文件的理解,如Spring的beans.xml和Hibernate的hibernate....

    WebWork.Spring.Hibernate整合开发网络书城

    《WebWork.Spring.Hibernate整合开发网络书城》这个主题涵盖了三个关键的技术框架:WebWork、Spring和Hibernate。这些技术在现代企业级Java应用开发中扮演着至关重要的角色,特别是对于构建复杂的、数据驱动的Web...

    SSH整合学习笔记之spring与hibernate整合(二)之c3p0

    在Spring与Hibernate整合的过程中,c3p0是一个重要的第三方组件,它是一个开源的JDBC连接池,能够有效地管理和重用数据库连接,从而减少创建和关闭连接的开销,提高系统性能。c3p0提供了许多配置选项,如最小连接数...

    Struts+Spring+Hibernate整合练习

    Struts+Spring+Hibernate 整合是Java Web开发中常用的一种技术栈,它结合了三个强大的框架,分别负责表现层(Struts)、业务逻辑层(Spring)和持久化层(Hibernate)。这种组合提供了完整的MVC架构,使得开发过程...

    Struts+Spring+Hibernate 整合教程.pdf

    #### 二、Struts+Spring+Hibernate整合实践 **2.1 Spring整合Struts** **2.1.1 整合理念** Spring框架可以用来整合Struts框架,以实现更高级别的松耦合。通过这种方式,可以确保业务逻辑与UI逻辑的分离,同时也...

    轻量级Java EE企业应用实战——Struts 2+Spring+Hibernate整合开发电子书1

    《轻量级Java EE企业应用实战——Struts 2+Spring+Hibernate整合开发电子书1》是一本专注于Java EE企业级应用开发的书籍,主要涵盖了Struts 2、Spring和Hibernate这三个流行开源框架的整合应用。这本书对于Java...

    轻量级 J2EE 企业应用实战:Struts+Spring+Hibernate 整合开发

    《轻量级 J2EE 企业应用实战:Struts+Spring+Hibernate 整合开发》是一本深入探讨Java企业级应用程序开发的经典著作。该书主要围绕着三个核心框架——Struts、Spring和Hibernate,详细阐述了如何在J2EE环境下进行轻...

    Spring与Hibernate整合.zip

    本压缩包"Spring与Hibernate整合.zip"显然包含了一个关于如何将这两个框架集成到同一Java EE项目的教程或示例代码。下面将详细讲解Spring和Hibernate整合的关键步骤和概念。 1. **Spring的Bean管理**:首先,Spring...

    Struts Spring Hibernate整合实践

    整合这三个框架的目的是提高开发效率,降低维护成本,通过Spring的IoC和AOP特性,实现组件间的解耦和事务管理,而Hibernate则简化了数据库操作。在实际项目中,这种整合提供了强大的后端架构,能够应对复杂的业务...

    struts2+spring+hibernate整合小案例

    这个"struts2+spring+hibernate整合小案例"是一个用于教学和实践的DEMO,旨在帮助开发者理解和掌握这三大框架的协同工作方式。 首先,Struts2作为MVC(模型-视图-控制器)架构的一部分,主要负责处理HTTP请求,提供...

    Spring整合Hibernate案例

    在本文中,我们将深入探讨如何将Spring框架与Hibernate ORM(对象...通过以上步骤,我们可以成功地将Spring与Hibernate整合,实现高效的数据访问层。这个案例旨在帮助初学者理解整合过程,并为实际项目开发提供参考。

    struts,spring,hibernate整合

    整合Struts、Spring和Hibernate的主要目的是消除各框架之间的耦合,实现更好的解耦和模块化。在SSH整合中,通常会使用Spring来管理Struts的Action和Hibernate的SessionFactory,Spring的AOP可以用来处理事务管理。...

    struts1+spring+hibernate整合所用全部jar包

    Struts1、Spring和Hibernate是Java Web开发中的三大框架,它们各自解决了一部分问题,而将它们整合在一起,可以构建出高效、灵活的企业级应用程序。这里我们主要探讨这三者整合时所需的核心jar包以及它们的功能。 ...

    struts2+spring+hibernate整合步骤

    整合Struts2、Spring和Hibernate可以实现业务逻辑、控制流程和持久层的解耦,提高代码的可读性和可维护性。然而,这个过程需要注意版本兼容性,避免因不同版本间的冲突导致问题。同时,理解并熟练掌握这三个框架的...

    struts2+spring+hibernate整合实例

    以上是对"struts2+spring+hibernate整合实例"的详细解释,整合这三大框架能够构建出功能强大的企业级Web应用,但同时也需要开发者具备扎实的Java基础和良好的架构设计能力。在实际项目中,应根据需求选择最合适的...

    java+Spring+Hibernate整合的企业OA源码

    【标题】"java+Spring+Hibernate整合的企业OA源码"所代表的是一个使用Java编程语言,结合Spring框架和Hibernate持久层框架实现的企业级办公自动化(Office Automation,简称OA)系统的源代码。这样的系统通常用于...

Global site tag (gtag.js) - Google Analytics