hibernate插入一张表中数据时报错,更新和删除不包错但数据库中的数据没有改变,其他表的操作都没有错。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate插入一张表中数据时报错,更新和删除不包错但数据库中的数据没有改变,其他表的操作都没有错。相关的知识,希望对你有一定的参考价值。
数据库是mysql
org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
(1)这个异常是由于主键设置为自增长,而在我们插入记录的时候设置了ID的值导致的。
(2)使用的是hibernate的saveOrUpdate方法保存实例
saveOrUpdate要求:只有ID为null才执行save,其他情况下执行update
在保存实例的时候是新增,但你的ID不为null,所有就执行update操作,可是数据库没有主键对应的值,所有出现了异常。
(3)在Hibernate映射一对多,多对一,多对多的时候新增常常会出现异常
具体请见链接:http://blog.csdn.net/lixld/article/details/41958181 参考技术B 看看有没有事务锁定,begin tran之后没有commit或者rollback会报这个错误。本回答被提问者采纳 参考技术C 看下你的ID生成策略, 是否自动生成, 这时插入数据, 不能给ID,否则会报错.
触发器-当一个表更新时,将数据插入另一张表中
参考技术A https://blog.csdn.net/qq_36020545/article/details/76502233https://blog.csdn.net/weixin_30412167/article/details/96470305
-- 直接运行即可
-- 当商品上下架状态更新时,记录到另一个表中
DROP TRIGGER IF EXISTS updatetbl_slope;-- 删除原先的触发器
CREATE trigger updatetbl_slope
AFTER update-- 表示触发器是在激活它的语句之后触发
on aa_product
for each row -- mysql固定语法
BEGIN
IF new.IsOnSell <> old.IsOnSell
then
if EXISTS(SELECT * FROM aa_isonsell WHERE ProId=old.ProId LIMIT 1)
THEN
update aa_isonsell set IsOnSell=new.IsOnSell where ProId=old.ProId;
else
insert into aa_isonsell(ProId,IsOnSell) VALUES(old.ProId,new.IsOnSell);
END IF;
END IF;
END
以上是关于hibernate插入一张表中数据时报错,更新和删除不包错但数据库中的数据没有改变,其他表的操作都没有错。的主要内容,如果未能解决你的问题,请参考以下文章