hibernate里更新对象操作中途 报错 进了catch方法但最后执行完 还是更新了字段,怎么修改好,求大神帮助
DEBUG到了inta=3/0后进catch再继续循环对象但每次都是进catch,debug时候没一次进过update方法那里,但最后调试结束后这个对象里的字段还是更新了...
DEBUG到了 int a = 3/0后 进catch 再继续循环对象 但每次都是进catch,debug时候没一次进过update方法那里,但最后调试结束后 这个对象里的字段还是更新了。。。这是为什么
这个是事务配置文件,绝对好使
我记忆中hibernate更新对象时候 首先是select指定id 然后再update 这里更新的原因可能也是这个问题。求大神怎么改。逻辑就是中途报错就不应该更新对象
之前那个想追问 结果点错了。。。竟然采纳了晕
大神继续帮我解决这个问题谢谢了
这个是action层调用service层的方法,然后再这个deliverGVS方法里面进行了更新操作
这个是deliverGVS里往RecoverTC对象set指定字段后 把那个对象保存在了List《RecoverTCShareStock》里,再下面再把这个list迭代 取出每个对象进行单个的更新。
但问题是debug 压根不走update那个方法,我在update方法里打断点 它也没进这个,但最后执行了update语句 很好奇。。。。
在线等。。。。求遇到过的大神帮忙,debug没进update语句但最后走完debug的话控制台会输出如下图,红色异常就是by zero异常,这个没问题,但下面竟然有个update。。。 展开
这个是事务配置文件,绝对好使
我记忆中hibernate更新对象时候 首先是select指定id 然后再update 这里更新的原因可能也是这个问题。求大神怎么改。逻辑就是中途报错就不应该更新对象
之前那个想追问 结果点错了。。。竟然采纳了晕
大神继续帮我解决这个问题谢谢了
这个是action层调用service层的方法,然后再这个deliverGVS方法里面进行了更新操作
这个是deliverGVS里往RecoverTC对象set指定字段后 把那个对象保存在了List《RecoverTCShareStock》里,再下面再把这个list迭代 取出每个对象进行单个的更新。
但问题是debug 压根不走update那个方法,我在update方法里打断点 它也没进这个,但最后执行了update语句 很好奇。。。。
在线等。。。。求遇到过的大神帮忙,debug没进update语句但最后走完debug的话控制台会输出如下图,红色异常就是by zero异常,这个没问题,但下面竟然有个update。。。 展开
3个回答
展开全部
在Hibernate中对象有三种状态:
临时状态(Transient):用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象;
持久化状态(Persistent):已经持久化,加入到了Session缓存中。如通过hibernate语句保存的对象。处于此状态的对象叫持久对象;
游离状态(Detached):持久化对象脱离了Session的对象。如Session缓存被清空的对象。特点:已经持久化,但不在Session缓存中。处于此状态的对象叫游离对象;
你在recoverTCSharedStock方法中是从数据库中直接查找出的对象,所以全部是持久态的,在当前事务中所有的更新在事务结束的时候都会自动持久化到数据库中,也就是不需要update方法,你只set相应的属性,hibernate就会自动的update到数据库中。
看你的代码 只需要查出不符合要求的list然后在deliverGVS里往RecoverTC对象set指定字段
然后就可以结束事务了。这是持久态对象的特点。
追问
你的意思是说 因为我的这个对象是通过hibernate查出来的持久化对象,所以不用进行update语句 hibernate也会自动对持久化的对象进行更新操作的意思吗?那你的意思是说我这里的update更新操作是多余的操作,try catch也是多余的步骤了的意思吗?~~~
追答
是的,下面的操作直接不需要。你把下面注释掉再跑一下试试
展开全部
看你的描述,直接的想法可能有两个,
1,你把这个代码完整的贴出来,可能在遍历之前就已经修改了这个对象,不一定是在你这个updateRecoverTC方法里面修改了,只要是持久化对象,在事务范围之内,修改了属性,hibernate都会自动更新的;
2,其次,你try..catch了,错误并没有抛出给spring,那spring得不到异常信息,当然认为你这个方法是正常执行成功了的,所以也没有必要回滚事务。你要记住,回滚事务一定是spring catch到了runtimeException(默认情况下)才会回滚。
1,你把这个代码完整的贴出来,可能在遍历之前就已经修改了这个对象,不一定是在你这个updateRecoverTC方法里面修改了,只要是持久化对象,在事务范围之内,修改了属性,hibernate都会自动更新的;
2,其次,你try..catch了,错误并没有抛出给spring,那spring得不到异常信息,当然认为你这个方法是正常执行成功了的,所以也没有必要回滚事务。你要记住,回滚事务一定是spring catch到了runtimeException(默认情况下)才会回滚。
追问
这个代码整个贴出来 反而更复杂 看不懂的,我这个逻辑简单的说 是更新上面对象里的3个字段,但这3个字段中2个字段是调用一个接口取,一个字段是手动进行set,然后把所有更新后的对象 进行更新的操作,但现在发版前 测试时候 发现有这种BUG,没遇到过。。。
追答
那应该就是我说的第二条。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-09-23
展开全部
updateRecoverTCSharedStock方法内部产生或抛出了异常。
看相关的代码去解决
看相关的代码去解决
更多追问追答
追问
这个跟内部update异常没关系吧。。。不加那个int a =3/0行 它可以正常更新,现在是debug时候它也不到update行 但最后还是更新了。。控制台出一大堆update语句
追答
3/0
当然报异常了,除数是0。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询