JPA复制修改表数据时报错:Identifier of an instance was altered
解决JPA "Identifier of an instance was altered" 错误
你遇到的这个错误根源在于:从仓库查询返回的OrderInfo实例是被JPA持久化上下文跟踪的已管理实体,JPA严格禁止修改这类实体的标识符(id字段)——哪怕你把它设为null也会触发校验报错。
正确处理方式
不要直接修改原有的持久化实体,而是为每个查询到的对象创建一个新的OrderInfo实例,复制原对象的属性后再调整需要修改的字段,最后保存这些新对象:
List<OrderInfo> orderInfos = ordeRepository.findByOrderId(fetchOrderId); List<OrderInfo> newOrderInfos = orderInfos.stream() .map(oi -> { // 创建新实例,复制原对象的所有业务属性 OrderInfo newOi = new OrderInfo(); newOi.setOrderId(newOrderId); // 复制其他需要保留的属性,示例: // newOi.setOrderAmount(oi.getOrderAmount()); // newOi.setCustomerId(oi.getCustomerId()); // 新实例id设为null(或依赖JPA自动生成,依你的实体配置而定) newOi.setId(null); return newOi; }) .collect(Collectors.toList()); orderInfoRepository.saveAll(newOrderInfos);
补充说明
- 新创建的
OrderInfo属于临时状态,不在JPA持久化上下文的管理范围内,修改它的id不会触发校验。 - 保存时JPA会自动识别这些临时实体为新数据,执行插入操作而非更新。
内容的提问来源于stack exchange,提问作者Gaurav Matta
相关产品推荐
相关产品推荐

