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

参考技术A 出现这个错误原因有三个:
(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/76502233

https://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插入一张表中数据时报错,更新和删除不包错但数据库中的数据没有改变,其他表的操作都没有错。的主要内容,如果未能解决你的问题,请参考以下文章

触发器-当一个表更新时,将数据插入另一张表中

Oracle查询一张表插入另一张表中

oracle中,如何在一张表插入数据,使得插入数据的某些字段为其他表中的数据

sql语句 怎么从一张表中查询数据插入到另一张表中

sql语句 怎么从一张表中查询数据插入到另一张表中

sql语句 怎么从一张表中查询数据插入到另一张表中