Spring关于事务的配置方式有多种,但是基本操作方式有两种
这里介绍的配置用的是tx标签配置
* 直接的SessionFactory*
* 基于SessionFactory的HibernateTemplate*
1、 直接的SessionFactory
1.1、 需要配置的地方
1) application.xml配置包括:配置SessionFactory(相当于spring管 理hibernate)、配置事务管理器(transactionManager)、配置事务的传播特性(配置需要事务管理的方法怎么创建事务)、创建一个Aop切面(哪里需要事务,一般是在service层)、向dao中注入sessionFactory
2) 在dao层添加SessionFactory类属性(记得get、set),注意这里是在dao层中注入,service层中不需要,而配置文件中添加事务时需要在service层中添加(service层中执行dao层中的多个方法)
1.2、 applicationContext.xml的基本配置
<!--配置sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- 配置事物管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 配置事物的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 创建一个切面 -->
<aop:config>
<aop:pointcut id="allDaoMethod" expression="execution(* xdd.service.*.*(..))"/>
<aop:advisor pointcut-ref="allDaoMethod" advice-ref="txAdvice"/>
</aop:config>
<!-- entity-bean -->
<bean id="student" class="xdd.entity.Student"/>
<bean id="teacher" class="xdd.entity.Teacher"/>
<!-- dao-bean -->
<bean id="studentDao" class="xdd.dao.imp.StudentDaoImp">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="student" ref="student"/>
</bean>
<bean id="teacherDao" class="xdd.dao.imp.TeacherDaoImp">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="teacher" ref="teacher"/>
</bean>
<!-- service-bean -->
<bean id="addService" class="xdd.service.imp.AddServiceImp">
<property name="studentDao" ref="studentDao"/>
<property name="teacherDao" ref="teacherDao"/>
</bean>
1.3、 常见问题
1)dao层忘记注入SessionFacory,会报sessionFactory为null的错误
2)service层中不需要注入sessionFactory,不会报错,但是无用
3)创建的Aop切面是一般对service,不是dao
2、 基于SessionFactory的HibernateTemplate
2.1、 需要配置的地方
1) application.xml配置包括:配置SessionFactory(相当于spring管理hibernate)、在dao中注入sessionFactory
2) dao层中的实现类需要继承HibernateDaoSupport,类中用getHibernateTemplate方法来操作数据库,不需要写SessionFactory类型的属性以及get、set方法(直接用SessionFactory需要写),直接使用
3) 在hibernate配置文件中配置事务为自动提交(配置事务自动提交),否则运行时会打印sql语句,但是不会对数据库操作
2.2、 applicationContext.xml的基本配置
<!--配置sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- entity-bean -->
<bean id="student" class="xdd.entity.Student"/>
<bean id="teacher" class="xdd.entity.Teacher"/>
<!-- dao-bean -->
<bean id="studentDao" class="xdd.dao.imp.StudentDaoImp">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="student" ref="student"/>
</bean>
<bean id="teacherDao" class="xdd.dao.imp.TeacherDaoImp">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="teacher" ref="teacher"/>
</bean>
<!-- service-bean -->
<bean id="addService" class="xdd.service.imp.AddServiceImp">
<property name="studentDao" ref="studentDao"/>
<property name="teacherDao" ref="teacherDao"/>
</bean>
2.3、 常见问题
1) 在spring配置文件,dao的bean中没有注入sessionFactory,运行时会报sessionFactory or hibernateTemplate is required
2) 没有配置事务自动提交,不会报错,但是只打印sql,却不操作数据库
3) dao层的实现类中不需要生命SessionFactory类型的属性,多余