转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6785323.html
前言:整合概述
Spring整合Hibernate主要是把Hibernate中常用的SessionFactory、session对象等的创建托管给Spring容器,并且利用SpringAOP进行事务管理。
由“常用对象托管、事务管理”的需求,我们就不难得到整合时需要做的工作了:
1:托管Hibernate常用的对象如:SessionFactory
2:托管数据源
3:事务管理配置
4:托管持久层对象,并注入sessionFactory
5:持久层对象使用sessionFactory进行持久化操作,也可以使用Spring提供的持久层操作模版进行持久化操作
下面,是具体整合开发的步骤。
一:定义实体类Bean,并得到每个实体类的映射文件。
可以由反向工程,由数据库表快速得到实体bean以及映射文件。
二:定义持久层DAO Bean
继承HibernateDaoSupport 定义DAO bean,bean中定义一个私有成员 SessionFactory,然后定义一系列持久化方法。
整合后持久化方法有两种写法:
1:按照传统的Hibernate框架的使用方法,通过sessionFactory.openSession等方法获取session,然后用session进行HQL/QBC查询。
2:使用Spring对Hibernate框架的进一步封装得到的方法,建议使用第一种:模版法。
getHibernateTemplate():返回一个Hibernate操作模版类,提供一系列简单的save/find/update等方法,并且自动管理事务与session生命周期。
不配置事务时:每次操作对应一个新的session,自动提交,自动关闭;
配置事务时:统一一个事务绑定一个session,事务由spring管理,自动关闭;
getHibernateTemplate().save(member); getHibernateTemplate().update(member); getHibernateTemplate().delete(getHibernateTemplate().get("com.leec.demo.db.DTO.MemberDTO", _id)); String queryString = "from MemberDTO where name = ?"; List<MemberDTO> ls = getHibernateTemplate().find(queryString, _name);
getSession()
不配置事务时:每次操作对应一个新的session,手动提交,手动关闭;
配置事务时:统一一个事务绑定一个session,事务由spring管理,自动关闭;
getHibernateTemplate().getSessionFactory().getCurrentSession()——
这是hibernate的官方方法,获取当前线程绑定的session
不配置事务时:不能使用;
配置事务时:统一一个事务绑定一个session,事务由spring管理,自动关闭;
getHibernateTemplate().getSessionFactory().openSession()(不推荐使用)
这是hibernate的官方方法,创建一个新的session。
事务自己管理,不受spring控制,同hibernate原来的做法,手动提交,手动关闭;
三:配置applicationContext.xml
1:配置数据源:指明数据源种类、驱动、数据库url、用户名、密码等
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">//主要有两种:传统的BasicDataSourse和C3P0的CombolpooledDataSourse <!--配置数据库连接信息--> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url" value="jdbc:mysql://localhost:3306/数据库名" /> <property name="username"> <value>账户</value> </property> <property name="password"> <value>密码</value> </property> </bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass"> <value>com.mysql.jdbc.Driver</value> </property> <property name="jdbcUrl"> <value>jdbc:mysql://localhost:3306/数据库名</value> </property> <property name="user"> <value>root</value> </property> <property name="password"> <value>root</value> </property> </bean>
2:整合Hibernate:配置SessionFactory标签,在子标签中 注入数据源、指明hibernate的相关配置信息、配置映射文件路径
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!--注入数据源--> <property name="dataSource"> <ref bean="dataSource" /> </property> <!--配置hibernate配置,主要是之前hibernate.cfg.xml中的信息--> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">//方言 org.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql">//打印语句 true </prop> </props> </property> <!--配置实体类的映射文件--> <property name="mappingResources"> <list>//多个映射文件,用list来罗列 <value>XX/XXX/XX.hbm.xml</value> <value>XX/XX/XXX.hbm.xml</value> ...... </list> </property> </bean>
3:注册各种要托管的Bean,进行各种设置如:注入(DAO bean尤其要记得注入sessionFactory)
<bean id="Service" class="...Service"> <property name="XXDAO Bean成员" ref="XXDAO" />//注入DAO对象,在service层调用持久化方法 </bean> <bean id=XXDAO" class="...xxDAO"> <property name="sessionFactory">//往DAObean注入sessionFactory,以供进行hibernate持久化操作 <ref bean="sessionFactory" /> </property> </bean>
4:配置事务管理器
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">//使用Hibernate事务管理器 <property name="sessionFactory">//注入sessionFactory <ref bean="sessionFactory" /> </property> </bean>
5:配置事务管理通知tx:advice
<!-- 事务通知 --> <tx:advice id="txAdvice" transaction-manager="txManager"> <!-- 为哪些方法进行事务管理、怎么管理--> <tx:attributes> <!-- 所有get开头的方法的事务定义 --> <tx:method name="get*" propagation="REQUIRED"/>//以正则表达式的形式匹配需要进行事务管理的方法,并指明如何管理事务 <!-- 其他的方法的事务定义--> <tx:method name="*" .../> </tx:attributes> </tx:advice>
6:配置切面,把事务通知切入Service层的方法
<aop:config> <aop:pointcut id="pointcut1" expression="execution(返回值 路径.方法名.(参数列表))"/>//切入点筛选出需要进行事务管理的方法,至于如何管理,则在tx:advice中再匹配 <aop:advisor advice-ref="txAdvice1" pointcut-ref="pointcut1"/> </aop:config>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass"> <value>com.mysql.jdbc.Driver</value> </property> <property name="jdbcUrl"> <value>jdbc:mysql://localhost:3306/couplespace</value> </property> <property name="user"> <value>root</value> </property> <property name="password"> <value>root</value> </property> </bean>