No Hibernate Session bound to thread, and configuration does not allow creation



No Hibernate Session bound to thread, and configuration does not allow creation

No Hibernate Session bound to thread, and configuration does not allow creation

出现了这个问题,原因就是没有给操作数据库的service方法配置事务。 事务传播行为种类解析及配置如下例:

Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:

表1事务传播行为类型

事务传播行为类型 说明
PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

当使用PROPAGATION_NESTED时,底层的数据源必须基于JDBC 3.0,并且实现者需要支持保存点事务机制。

<!–Hibernate事务管理器–> <bean id=”transactionManager” class=”org.springframework.orm.hibernate3.HibernateTransactionManager”> <property name=”sessionFactory”> <ref bean=”sessionFactory” /> </property> </bean>

<!– 定义事务拦截器bean–> <bean id=”transactionInterceptor” class=”org.springframework.transaction.interceptor.TransactionInterceptor”> <!– 事务拦截器bean需要依赖注入一个事务管理器–> <property name=”transactionManager” ref=”transactionManager” /> <property name=”transactionAttributes”> <!– 下面定义事务传播属性–> <props> <prop key=”save*”>PROPAGATION_REQUIRED</prop> <prop key=”find*”>PROPAGATION_REQUIRED,readOnly</prop> <prop key=”delete*”>PROPAGATION_REQUIRED</prop> <prop key=”update*”>PROPAGATION_REQUIRED</prop> <prop key=”*”>PROPAGATION_REQUIRED</prop> </props> </property> </bean>

<bean id=”managerTemplate” abstract=”true” lazy-init=”true”> <property name=”teamDao”> <ref bean=”teamDao” /> </property> <property name=”studentDao”> <ref bean=”studentDao” /> </property> </bean>


<bean id =”manager” class=”com.zd.service.impl.Manager” parent=”managerTemplate” />

<!– 定义BeanNameAutoProxyCreator–> <bean class=”org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator”> <!– 指定对满足哪些bean name的bean自动生成业务代理 –> <property name=”beanNames”> <!– 下面是所有需要自动创建事务代理的bean–> <list> <value>manager</value> </list> <!– 此处可增加其他需要自动创建事务代理的bean–> </property> <!– 下面定义BeanNameAutoProxyCreator所需的事务拦截器–> <property name=”interceptorNames”> <list> <!– 此处可增加其他新的Interceptor –> <value>transactionInterceptor</value> </list> </property> </bean>

<!– 基本数据库操作 –> <bean id=”baseDao” class=”com.zd.service.impl.BaseDao”> <property name=”hibernateTemplate”> <ref bean=”hibernateTemplate”/> </property> </bean>

<!– 班级 –> <bean id=”teamDao” class=”com.zd.service.impl.TeamDao”> <property name=”baseDao”> <ref bean=”baseDao” /> </property> </bean>

<!– 学生 –> <bean id=”studentDao” class=”com.zd.service.impl.StudentDao”> <property name=”baseDao”> <ref bean=”baseDao” /> </property> </bean>

public void testSaveTeam() { Team team = new Team(); team.setTeamId(DBKeyCreator.getRandomKey(12)); team.setTeamName(“Class CCC”); IManager manager = (IManager) SpringContextUtil.getContext().getBean(“manager”);

Student student = new Student(); student.setStudentId(DBKeyCreator.getRandomKey(13)); student.setSex(Student.SEX_FEMALE); student.setStudentName(“Tom”); student.setTeamId(“60FHDXDIG5JQ”); manager.saveTeamAndStu(team, student); System.out.println(“Save Team and Student Success”);