`
dyllove98
  • 浏览: 1405285 次
  • 性别: Icon_minigender_1
  • 来自: 济南
博客专栏
73a48ce3-d397-3b94-9f5d-49eb2ab017ab
Eclipse Rcp/R...
浏览量:39053
4322ac12-0ba9-3ac3-a3cf-b2f587fdfd3f
项目管理checkList...
浏览量:80058
4fb6ad91-52a6-307a-9e4f-816b4a7ce416
哲理故事与管理之道
浏览量:133165
社区版块
存档分类
最新评论

使用spring的hibernateTemplate的方法

阅读更多

1.管理SessionFactory

   使用Spring整合Hibernate时我们不需要hibernate.cfg.xml文件。首先,在applicationContext.xml中配置数据源(dataSource)bean和session工厂(sessionFactory)bean。其中,在配置session工厂bean时,应该注入三个方面的信息:

      ●数据源bean

      ●所有持久化类的配置文件

      ●Hibernate的SessionFactory的属性

Hibernate的SessionFactory的属性信息又包括两个内容,一,Hibernate的连接方法;二,不同数据库连接,启动时的选择。

2.为HibernateTemplate注入SessionFactory对象,通过HibernateTemplate来持久化对象

   Spring提供了HibernateTemplate,用于持久层访问,该模板无需打开Session及关闭Session。它只要获得SessionFactory的引用,将可以只能地打开Session,并在持久化访问结束后关闭Session,程序开发只需完成持久层逻辑,通用的操作(如对数据库中数据的增,删,改,查)则有HibernateTemplate完成。

   HibernateTemplate有三个构造函数,不论是用哪一种构造,要使HibernateTemplate能完成持久化操作,都必须向其传入一个SessionFactory的引用。

   HibernateTemplate的用法有两种,一种是常规的用法,另一种是复杂的用。

      一,常规的用法

         HibernateTemplate通过它自己的delete(Object entity) ,find(String queryString),save(Object entity)等等常用的方法即可完成大多数DAO对象的增,删,改,查等操作。

      二,复杂的用法

         HibernateTemplate的复杂的用法是通过如下的两个方法来完成的:

            ●Object execute(HibernateCallback action)

            ●List execute(HibernateCallback action)

         这两个方法都需要一个HibernateCallback实例,程序开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决了Spring封装Hibernate后灵活不足的缺陷。HibernateCallback是一个接口,该接口只有一个方法doInHibernate(org.hibernate.Session session),该方法只有一个参数Session。

         通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,方法doInHibernate就是Spring执行的持久化操作。具体的代码实例如下:

         public class PersonDaoImpl {

                 private SessionFactory sessionFactory;

                 public void setSessionFactory(SessionFactory sessionFactory) {

                         this.sessionFactory = sessionFactory;

                 }

                 public List findPersonByName(final String name) {

                         HibernateTemplate hibernateTemplate =

                                            new HibernateTemplate(this.sessionFactory);

                         return (List)hibernateTemplate.execute(

                                   public Object doInHibernate(Session session)  throws Hibernate Exception {

                                           List result =session.createCriteria(Person.clsss)

                                                                         .add(Restrictions.like("name",name+"%")).list();

                                           return result;

                                   }

                         );

                 }

        }

       注:在方法doInHibernate内可以访问Session,该Session对象是绑定到该线程的Session实例,该方法内的持久层操作与不使用Spring时的持久层操作完全相同,这保证了对于复杂的持久层访问时,依然可以使用Hibernate的访问方式。

3.DAO的实现

   DAO的实现有两种方式:一,继承HibernateDaoSupport实现DAO;二,基于Hibernate3.0实现DAO。

      一,继承HibernateDaoSupport实现DAO

         Spring为Hibernate的DAO提供了工具类HibernateDaoSupport。该类主要提供了如下两个方法来方便DAO的实现:

         ●public final HibernateTemplate getHibernateTemplate()

         ●public final void setSessionFactory(SessionFactory sessionFactory)

         其中,setSessionFactory方法用来接收Spring的ApplicationContext依赖注入的SessionFactory实例;getHibernateTemplate方法则用来根据刚才的SessionFactory产生Session,最后由HibernateTemplate来完成数据库访问。

      二,基于Hibernate3.0实现DAO

        在Hibernate处于事务的管理下时(通常Spring为Hibernate提供事务管理),通过SessionFactory的getCurrentSession()方法可以返回当前的Session,如果当前的JTA事务关联的Session不存在,则系统打开一次新的Session,并关联到当前的JTA事务;如果当前JTA事务关联的Session已经存在,则直接返回该Session。获得了当前的Session后就可以进行持久化操作了。

      可见,不论使用上面的哪一种方式实现DAO都需要用Spring来注入SessionFactory实例。

4.事务的管理

   Hibernate建议所有的对数据库的访问都应放在事务内进行,即使进行的只是读操作。Spring同时支持编程式事务和声明式事务。通常推荐使用声明式事务。

   编程式事务管理:

   编程式事务提供了TransactionTemplate模板类,用的时候必须向其体提供一个PlatformTransactionManager实例。只要TransactionTemplate获取了PlatformTransactionManager的引用,TransactionTemplate就可以完成事务操作了。TransactionTemplate提供了一个execute方法,它接收一个TransactionCallback实例。TransactionCallback包含如下方法:

      ●Object doInTransaction(TransactionStatus status)

这是需要有返回值的情况。如果不需要有返回值的话,我们可以用TransactionCallbackWithOutResult类来代替TransactionCallback类,它也有一个方法:

      ●void doInTransaction(TransactionStatus status)

   在这个两个方法中,在出现异常时,TransactionStatus的实例status可以调用setRollbackOnly()方法进行回滚。

   一般情况下,向execute方法传入TransactionCallback或TransactionCallbackWithOutResult实例时,采用的是匿名内部类的形式。

   声明式事务管理:

   声明式事务管理的配置方式通常有三种:

      ●使用TransactionProxyFactoryBean为目标bean生成事务代理的配置。

      ●使用BeanNameAutoProxyCreator,根据bean name自动生成事务代理的方式,这是直接利用Spring的AOP框架配置事务代理的方式,需要对Spring的AOP框架有所了解。

      ●使用DefaultAdvisorAutoProxyCreator,这也是直接利用Spring的AOP框架配置事务代理的方式,只是这种配置方式的可读性不如使用BeanNameAutoProxyCreator的配置方式。
------------------------------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
       <property name="driverClassName">
           <value>com.mysql.jdbc.Driver</value>
       </property>
       <property name="url">
           <value>jdbc:mysql://localhost/test</value>
       </property>
       <property name="username">
           <value>root</value>
       </property>
       <property name="password">
           <value>8093</value>
       </property>
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource">
   <ref local="dataSource"/>
  </property>
  <property name="mappingResources">
   <list>
    <value>user.hbm.xml</value>
   </list>
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    <prop key="hibernate.show_sql">true</prop>
   </props>
  </property>
</bean>  

    <bean id="userDAO" class="com.dang.action.UserDAOImpl">
  <property name="sessionFactory">
   <ref local="sessionFactory"/>
  </property>
</bean> 

<bean name="/regedit" class="com.dang.action.RegeditAction">
     <property name="userDAO">
        <ref bean="userDAO"/>
     </property>
</bean>

  <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
       <property name="sessionFactory">
           <ref local="sessionFactory" />
       </property>
    </bean>

   <bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
     <property name="transactionManager">
         <ref bean="transactionManager" />
     </property>
     <property name="target">
         <ref local="userDAO" />
     </property>
     <property name="transactionAttributes">
         <props>
            <prop key="create*">PROPAGATION_REQUIRED</prop>
         </props>
     </property>
   </bean>
</beans>

分享到:
评论

相关推荐

    spring hibernatetemplate

    在Spring框架中,`HibernateTemplate`是一个非常重要的组件,它为开发者提供了与Hibernate持久化库交互的便捷方式。然而,正如描述中所指出的,直接使用`HibernateTemplate`进行事务管理并不总是最佳实践,尤其是在...

    Spring_Spring_Hibernate_HibernateTemplate

    - 创建HibernateTemplate实例:使用SessionFactory创建HibernateTemplate,通常通过`setSessionFactory()`方法注入SessionFactory。 - 编写业务逻辑:调用HibernateTemplate提供的方法,如`save()`, `update()`, `...

    关于使用HibernateTemplate

    ### 关于使用HibernateTemplate #### 一、简介与背景 在Java企业级应用开发中,持久层技术扮演着至关重要的角色。其中,Hibernate作为一款优秀的ORM(Object Relational Mapping)框架,极大地简化了数据访问层的...

    HibernateTemplate的方法使用

    **HibernateTemplate** 是 Spring 框架中用于简化 Hibernate 使用的一个工具类。它通过 AOP(面向切面编程)的思想,封装了大量的 CRUD(创建、读取、更新、删除)操作,使得开发者能够更加专注于业务逻辑的实现,而...

    Spring_2000_Spring_Hibernate_HibernateTemplate

    在这个主题下,我们将深入探讨Spring框架的核心特性,以及如何与Hibernate进行集成,特别是使用HibernateTemplate作为数据访问对象(DAO)层的工具。 **Spring框架** Spring是Java平台上广泛使用的开源框架,起源于...

    hibernateTemplate的常用方法

    通过上述介绍,我们可以看到`HibernateTemplate`的强大之处在于它不仅简化了Hibernate的集成与使用,还提供了一系列实用的方法来满足不同的业务需求。在实际项目开发中,合理利用这些方法可以大大提升开发效率和代码...

    HibernateTemplate汇总

    HibernateTemplate 是 Spring 框架中的一個关键组件,用于简化 Hibernate 的使用,提供了許多实用的方法来进行数据库操作。在本文中,我们将对 HibernateTemplate 的主要方法进行总结和解释。 ...

    HibernateTemplate详细描述以及使用范围

    在Spring框架中,`HibernateTemplate`作为ORM(Object Relational Mapping)技术中的一个重要组件,它提供了简化Hibernate操作的方法集,使得开发人员能够更加便捷地进行数据库操作。通过使用`HibernateTemplate`,...

    一个模拟Spring将SessionFactory注入到HibernateTemplate的小例子

    3. **使用HibernateTemplate**:在我们的业务逻辑类中,我们可以通过@Autowired注解或者使用getBean方法从Spring容器中获取HibernateTemplate实例,然后调用它的方法进行数据库操作。例如: ```java @Service ...

    HibernateTemplate 的常规用法.doc

    《轻量级 J2EE 企业应用实战: Struts+Spring+Hibernate 整合开发》一书中详述了Spring与Hibernate的整合,其中一个重要组件就是HibernateTemplate。它为简化Hibernate在Spring框架中的使用提供了便利,减少了手动...

    HibernateTemplate类的使用

    为了更便捷地使用Hibernate,Spring框架提供了一系列工具类来简化其操作流程,其中`HibernateTemplate`就是其中一个非常重要的组件。本文将详细介绍`HibernateTemplate`的基本概念、工作原理以及如何正确使用它来...

    Spring整合hibernate(2)之基于HibernateTemplate的整合

    Spring提供了声明式事务管理,可以在配置文件中定义事务管理器,并在Service方法上添加@Transactional注解来开启事务。 ```xml &lt;bean id="transactionManager" class="org.springframework.orm.hibernate5....

    hibernateTemplate

    `HibernateTemplate`是Spring框架提供的一个工具类,用于简化Hibernate的使用。它封装了许多常见的数据库操作,如增删改查等,同时支持分页查询以及命名查询等功能。使用`HibernateTemplate`可以减少大量模板代码的...

    spring集成hibernate所需jar包

    5. **事务管理**:利用Spring的@Transactional注解,声明方法需要在事务范围内执行,Spring会自动管理事务的开始、提交或回滚。 6. **数据访问**:在业务逻辑层,通过@Autowired注入DAO,调用其方法完成CRUD操作。 ...

    HibernateTemplate的用法总结

    HibernateTemplate是Spring框架提供的一种操作Hibernate的方式,它简化了Hibernate的使用过程,使开发者无需关注Session的管理与事务控制,极大地提高了开发效率。本文将对HibernateTemplate的主要用法进行详细介绍...

    Spring+hibernate整合源代码

    Spring 可以通过工厂方法或 JdbcTemplate、HibernateTemplate 提供的模板方法来获取 Session。 6. **Service 层设计**:Service 层是业务逻辑的核心,通常会注入 DAO 实例并调用其方法来完成业务处理。Service 层...

    HibernateTemplate源代码

    `HibernateTemplate`是Spring框架提供的一个强大的工具,它不仅简化了Hibernate的使用,还提供了异常转换、资源管理等功能,使得开发人员能够更加专注于业务逻辑的编写。通过对`HibernateTemplate`的学习和使用,...

    SSH2增删改查使用HibernateTemplate

    在这个框架中,HibernateTemplate是Spring提供的一个工具类,它简化了Hibernate的使用,使得开发者可以更方便地进行数据库操作,如增删改查。接下来,我们将深入探讨如何在SSH2中使用HibernateTemplate进行这些基本...

    使用Spring进行数据访问

    Spring通过HibernateTemplate或SessionFactoryBean与Hibernate进行集成,实现了事务管理和Session管理。而MyBatis是一个轻量级的ORM框架,它将SQL语句写在XML配置文件或注解中,Spring可以通过SqlSessionFactoryBean...

    HibernateTemplate分组统计

    1. **HibernateTemplate**:是Spring框架提供的用于简化Hibernate使用的模板类。它提供了大量操作数据库的方法,包括查询、更新等,并且内置了事务管理机制。 2. **分组统计**:指通过SQL语句对查询结果按照一个或多...

Global site tag (gtag.js) - Google Analytics