spring 事务中遇到的----奇异问题

ssh框架,Action里的取出对象,用set方法更新一个字段,然后调用Service里的一个事务性方法,方法体为空,但Hibernate却更新了数据库 - Java / Java EE

 
2010年08月30日 08:43 来源:普索网         |  关键词:ssh 框架 action   
楼主发表于:2010-08-18 17:41:40ssh框架,Action里的取出对象,用set方法更新一个字段,然后调用Service里的一个事务性方法,方法体为空,但Hibernate却更新了数据库????
Action:
MaterialInfo materialInfo = (MaterialInfo ) materialInfoService.get(MaterialInfo.class, id);
materialInfo.setIscase(1);//更改字段值
materialInfoService.setFlags(materialInfo);//调用Service层方法
return (mapping.findForward("success"));

Service:
public void setFlags(MaterialInfo materialInfo) throws Exception {
System.out.println("xxxx");//只有一句控制台输出,没有调用任何save
}
结果控制台输出:
xxxx
Hibernate: update M_MATERIALINFO set MED。。。//紧跟着一个Hibernate输出,这个是怎么出来的呢???
Spring配置文件:
<bean id="parentService" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager" />
<property name="proxyTargetClass" value="true" />
<property name="transactionAttributes">
<props>
                                 <prop key="set*">PROPAGATION_REQUIRED,-Exception</prop>
。。。


各位请指教,先行谢过!



#1楼 得分:0回复于:2010-08-19 16:58:40难道说Service管理的事务,Hibernate自动检测更改后,提交更新到数据库?

为什么会是这样的呢?
#2楼 得分:0回复于:2010-08-19 17:14:47hibernate有种情况不要执行update方法就能保存的 LZ去了解下这个
#3楼 得分:0回复于:2010-08-19 19:08:29<prop key="setFlags">PROPAGATION_SUPPORTS,readOnly</prop>
这样就不自动update了
#4楼 得分:0回复于:2010-08-27 16:34:01
引用 2 楼 thc1987 的回复:
hibernate有种情况不要执行update方法就能保存的 LZ去了解下这个


我不解的是,Action的对象状态更新,如果调用Service里的加了事务(setFlags就是事务的)的方法,即使这个方法什么都没有,他也会持久化到数据库;而如果是不调用或者调用非事务的方法,就不会改变;
如果说是Hibernate的机制,为什么必须是事务的方法才会呢?
如果说是Spring事务的机制,那为什么方法里面没有save或者update,也会持久化呢?
#5楼 得分:0回复于:2010-08-27 16:37:22
引用 3 楼 czycyy 的回复:
<prop key="setFlags">PROPAGATION_SUPPORTS,readOnly</prop>
这样就不自动update了


但我要的是放到Service里进行事务操作的,也就是Action里先把对象状态set改了,然后传到Service层进行事务操作,要写数据库更新其他表的,如果是readonly就不行了。

#6楼 得分:0回复于:2010-08-27 20:32:41看看Hibernate的设置,是否设置hibernate.connection.autocommit =true?

如果是的话,那么就会在解除一个JDBC连接前自动commit,也就是调用事物操作后自动commit。
#7楼 得分:0回复于:2010-08-27 21:14:34补充上面,如果autocommit是false。

那么还有可能是你的数据库表不支持Rollback,比如Mysql的MyISAM,要更改到InnoDB。(来源:[标签:出处])关键字:ssh 框架 action  | 来源:普索网 | 责任编辑:newshoo | 最后编辑:2010年08月30日 08时43分13秒
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值