关于Hibernate的 Batch update returned unexpected row count from update异常

本文探讨了Hibernate在一对多、多对一或多对多映射中出现的StaleStateException异常,尤其是在新增操作时。通过分析代码示例,指出BeanUtils在属性复制过程中可能导致的问题,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ERROR [http-8080-Processor22] (BatchingBatcher.java:60) - Exception executing batch:
org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
 查了很多资料,没有人能说清楚这个异常是如何产生的。

在Hibernate映射一对多,多对一,多对多的时候新增常常会出现这个异常,代码如下:

public void saveFunctionCell(FunctionCell functionCell, Integer pid) {
  System.out.println("现在进行新增操作");
  FunctionCell fc = new FunctionCell();
    try {
   BeanUtils.copyProperties(fc, functionCell);
  } catch (IllegalAccessException e) {
   e.printStackTrace();
  } catch (InvocationTargetException e) {
   e.printStackTrace();
  }
  fc.setFuncCellID(null);
  // 获得父权限
  FunctionCell pfc = functionCellDao.findFunctionCellByID(pid);
  fc.setParentFunctionCell(pfc);
  functionCellDao.saveFunctionCell(fc);
 }

注意特别标识出来的这个地方,BeanUtils拷贝Bean属性的时候,它会将你的Integer类型全部设置成0,在这里设置一个空,这样就不会抛出错误了。


### 批量更新返回意外行数解决方案 当遇到 `Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1` 错误时,通常意味着执行的SQL语句未能影响预期数量的数据行。此错误可能由多种原因引起。 #### 数据一致性问题 如果数据库中的数据存在不一致情况,比如重复记录或缺失记录,则可能导致实际受影响的行数不符合预期[^2]。为了处理这种情况,可以先清理数据以确保唯一性和完整性: ```sql DELETE FROM 表 WHERE (id) IN ( SELECT id FROM 表 GROUP BY id HAVING COUNT(id) > 1 ) AND ROWID NOT IN ( SELECT MIN(ROWID) FROM 表 GROUP BY id HAVING COUNT(*) > 1 ); ``` #### JPA配置调整 对于使用JPA的情况,可以通过适当设置事务管理和修改查询方式来解决问题。具体措施如下: - **添加事务管理**:在服务层方法上加上 `@Transactional` 注解,并指定回滚策略以及传播行为。 - **标注修改操作**:对于涉及更改数据库状态的操作(如删除),应在DAO接口定义处增加 `@Modifying` 和 `@Query` 注解。 ```java @Service public class MyService { @Autowired private MyRepository myRepository; @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) public void performUpdate() { // 调用带有 @Modifying 的 Repository 方法 myRepository.updateData(); } } @Repository public interface MyRepository extends JpaRepository<MyEntity, Long> { @Modifying(clearAutomatically = true) @Query("UPDATE MyEntity e SET ... WHERE ...") int updateData(); } ``` 通过上述手段能够有效减少因批量更新而导致的实际影响行数异常的问题发生概率[^5]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值