Spring 使用Hibernate事务管理:update等操作无效果问题
2017-07-20 17:10
218 查看
使用Spring事务管理
需要使用getCurrentSession获取session在操作中不要显示的关闭session
不需要进行编码式事务,使用声明式事务
实际问题:
经常会遇到事务管理使用hibernate时,在调用update方法时,数据返回正确,而数据库却没有更新调用save保存数据时,返回存储成功,数据库没有更新
删除数据时删除成功,数据库依然没有更新等问题
原因:
applicationContext.xml(类似同名)配置文件中,针对hibernate的事务管理配置与service定义的方法名称不相符事物配置中定义了只读权限,因此修改失败
事物配置未覆盖定义service
springmvc与hibernate的扫描位置冲突
详细解释:
事物配置中定义了类似【<tx:method name="update*" propagation="REQUIRED" />】的属性,即意味着以update开头的service具备了操作权限,但是如果用户自己定义的update拼写错误如拼写为updata等是无法真正更新成功的。<tx:method name="change*" propagation="REQUIRED" />定义了此属性,却命名service名称以其他方式开头如update这样依然是无法更新成功的。
<tx:method name="update*" propagation="REQUIRED" read-only="true" />,属性中限制了只能读取的操作,因此依然无法更新成功
name | 是 | 与事务属性关联的方法名。通配符(*)可以用来指定一批关联到相同的事务属性的方法。 如:'get*'、 'handle*'、 'on*Event'等等。 | |
propagation | 不 | REQUIRED | 事务传播行为 REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。 REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。 NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。 |
isolation | 不 | DEFAULT | 事务隔离级别 |
timeout | 不 | -1 | 事务超时的时间(以秒为单位) |
read-only | 不 | false | 事务是否只读? |
rollback-for | 不 | 将被触发进行回滚的 Exception(s);以逗号分开。 如: 'com.foo.MyBusinessException,ServletException' | |
no-rollback-for | 不 | 不 被触发进行回滚的 Exception(s);以逗号分开。 如: 'com.foo.MyBusinessException |
实例:(详细列举了各类配置方式)
在spring配置文件中添加如下代码<!-- 在 IOC 容器中配置 Hibernate 的事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 配置事务通知属性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- 定义事务传播属性 --> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="edit*" propagation="REQUIRED" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="new*" propagation="REQUIRED" /> <tx:method name="set*" propagation="REQUIRED" /> <tx:method name="remove*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="change*" propagation="REQUIRED" /> <tx:method name="get*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" /> <tx:method name="load*" propagation="REQUIRED" read-only="true" /> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
此时的dao层只需要简单的
session().update(entity)就行了。
相关文章推荐
- Spring整合Hibernate开发 - 使用事务管理器操作数据库 - 主配置文件
- 解决Hibernate的session.save/update/delete操作无效问题(事务管理)
- Spring整合hibernate:3、使用XML进行声明式的事务管理
- Spring整合hibernate的事务属性介绍以及声明式事务管理 (使用Annotation和xml)
- Spring整合Hibernate:2、使用Annotation方式进行声明式的事务管理
- Hibernate使用Spring进行单元测试时的事务问题
- spring管理的hibernate事务不会自动flush的问题-今天真遇到这问题了
- Spring2.5整合Hibernate3.0中使用XML以tx来配置事务管理。
- 关于spring+mybatis操作数据库多次异常 事务不被spring管理问题
- Spring整合Hibernate:2、使用Annotation方式进行声明式的事务管理
- spring 事务管理下的 hibernate 持久化实例操作的几点问题【查询/更新】
- Spring和Hibernate使用注解方式进行事务管理
- Spring整合hibernate的事务属性介绍以及声明式事务管理 (使用Annotation和xml)
- 关于spring整合hibernate使用update无异常但没有效果(不输出sql语句)
- hibernate,spring管理事务中(transaction,JDBC connection,Hibernate Session的使用)
- Java学习之道:纯Hibernate使用-不用spring事务管理
- Spring整合hibernate:3、使用XML进行声明式的事务管理
- Spring中事务管理与Hibernate自带事务管理冲突的一个问题
- 【Spring十】使用OpenSessionInView解决懒加载问题及Spring管理下的session和事务
- hibernate添加spring 事务管理注意问题记录