一、管理SessionFactory
使用Spring整合Hibernate时我们不需要hibernate.cfg.xml文件。首先,在applicationContext.xml中配置数据源(dataSource)bean和session工厂(sessionFactory)bean。其中,在配置session工厂bean 时,应该注入三个方面的信息:
●数据源bean
●所有持久化类的配置文件
●Hibernate的SessionFactory的属性
Hibernate的SessionFactory的属性信息又包括两个内容:
1. Hibernate的连接方法;
2. 不同数据库连接,启动时的选择。
二、为HibernateTemplate注入SessionFactory对象,通过HibernateTemplate来持久化对象
Spring提供了HibernateTemplate,用于持久层访问,该模板无需打开Session及关闭Session。它只要获得 SessionFactory的引用,将可以只能地打开Session,并在持久化访问结束后关闭Session,程序开发只需完成持久层逻辑,通用的操作(如对数据库中数据的增,删,改,查)则有HibernateTemplate完成。
HibernateTemplate有三个构造函数,不论是用哪一种构造,要使HibernateTemplate能完成持久化操作,都必须向其传入一个SessionFactory的引用。
HibernateTemplate的用法有两种,一种是常规的用法,另一种是复杂的用法。
1.常规的用法
HibernateTemplate通过它自己的delete(Object entity) ,find(String queryString),save(Object entity)等等常用的方法即可完成大多数DAO对象的增,删,改,查等操作。
2.复杂的用法
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的访问方式。
三、DAO的实现
DAO的实现有两种方式:一,继承HibernateDaoSupport实现DAO;二,基于Hibernate3.0实现DAO。
1.继承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来完成数据库访问。
2.基于Hibernate3.0实现DAO
在Hibernate处于事务的管理下时(通常Spring为Hibernate提供事务管理),通过SessionFactory的 getCurrentSession()方法可以返回当前的Session,如果当前的JTA事务关联的Session不存在,则系统打开一次新的 Session,并关联到当前的JTA事务;如果当前JTA事务关联的Session已经存在,则直接返回该Session。获得了当前的Session 后就可以进行持久化操作了。
可见,不论使用上面的哪一种方式实现DAO都需要用Spring来注入SessionFactory实例。
三、事务的管理
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>
分享到:
相关推荐
12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 ...
以下章节源码[03] [04] [05] [08] [10] [11] [12] [13] [14] [15] [16]
12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 ...
### Spring + Hibernate 详解与配置 #### Spring框架概述 Spring框架是一个开源的、轻量级的应用框架,旨在简化企业级应用开发。它提供了一个全面的编程模型,支持从Web到数据访问等各种应用需求。Spring的核心...
**Spring与Hibernate集成详解** 在Java企业级应用开发中,Spring和Hibernate是两个非常重要的框架。Spring是一个全方位的轻量级应用框架,提供了强大的依赖注入、AOP(面向切面编程)以及各种服务管理功能。而...
在Java开发领域,Spring和Hibernate是两个非常重要的框架。Spring是一个全面的后端应用...通过以上步骤,我们可以构建一个基本的Spring+Hibernate应用,实现对用户和日志数据的CRUD(创建、读取、更新、删除)操作。
- 接下来,我们需要添加 Hibernate 支持,选择 Spring 配置文件来生成 Hibernate 配置。在这个过程中,IDE 会自动生成 `SessionFactory` 的配置,我们需要为其指定一个唯一的名称。 4. **配置 DataSource**: - ...
本光盘是《整合Struts+Hibernate+Spring应用开发详解》一书的配书光盘,书中的代码按章存放, 即第二章所使用的代码放在codes文件夹的02文件夹下,依次类推。 本光盘根目录下有11个文件夹,其内容和含义说明如下: ...
Flex+Spring+Hibernate 整合是企业级应用开发中常见的一种技术栈组合,它结合了Flex前端的富互联网应用程序(RIA)开发能力、Spring框架的依赖注入和事务管理功能,以及Hibernate持久化框架的数据库操作便捷性。...
首先,Spring通过其优秀的AOP支持,可以实现对Hibernate的事务管理,使得事务的处理更加透明。其次,Spring的ApplicationContext可以加载Hibernate的相关配置,如SessionFactory,进而创建Session对象,进行数据库...
Struts1.2、Spring1.2和Hibernate2.0是经典的Java企业级开发框架组合,它们分别负责不同的职责,共同构建了一个强大的后端架构。Struts1.2作为MVC(模型-视图-控制器)框架,主要处理前端请求并控制页面展示;Spring...
Spring还提供了对Hibernate的异常转化支持,可以将Hibernate抛出的异常转换为Spring的一致性异常,从而简化异常处理的代码。 #### 五、总结 通过整合JSF、Spring和Hibernate,我们不仅能够构建出一个清晰、高效的...
### Spring与Hibernate集成详解 #### 一、Spring与Hibernate集成概述 在现代Java企业级应用开发中,Spring框架因其强大的依赖注入(DI)和面向切面编程(AOP)功能而备受青睐,它能帮助开发者简化Java应用的开发...
12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 ...
Struts 2+Hibernate+Spring整合开发技术详解sample.pdf
### Struts+Spring+Hibernate 整合教程知识点详解 #### 一、SSH整合理念与背景 **1.1 框架概述** 在构建复杂的Web应用程序时,开发人员需要面对诸多挑战,包括如何构建用户界面(UI)、业务逻辑(BL)的存放位置以及...
Spring为Hibernate提供了全面的集成方案,简化了DAO(Data Access Object)的开发,同时也支持其他ORM框架,使得应用能够在不同持久化技术间灵活切换。 6.5.1 Spring提供的DAO支持 Spring通过提供一系列的DAO抽象类...
《ZK+Spring+Hibernate整合详解》 ZK、Spring和Hibernate是Java开发中的三大重要框架,它们分别在用户界面、依赖注入与事务管理、持久层操作方面发挥着关键作用。将这三者进行整合,可以构建出高效、稳定且易于维护...
Struts、Spring 和 Hibernate 是Java Web开发中的三大框架,它们分别负责表现层、业务层和服务层的管理。本文将深入探讨如何在WebLogic服务器上整合这三个框架,实现一个高效的Struts Portlet。 **Struts 框架**: ...
《Spring与Hibernate整合详解》 在现代Java Web开发中,Spring和Hibernate是两个非常重要的开源框架,它们分别在依赖注入和对象关系映射(ORM)领域有着广泛的应用。Spring作为一个全面的轻量级应用框架,提供了...