云计算百科
云计算领域专业知识百科平台

然后 jpa 报错Duplicate entry ‘A012608110056‘ for key

找到根本原因了!


一、你的操作步骤

java

// 1. 查询旧数据
OldData = repository.findByFlowNo(\”XG01A012608110049\”);

// 2. 逻辑删除旧数据
OldData.setIsDeleted(1);
repository.save(OldData);

// 3. 用旧数据对象,改 flow_no,然后插入
OldData.setFlowNo(\”A012608110056\”); // ← 这里改了 flow_no
OldData.setId(null); // ← 设置 id 为 null
repository.save(OldData); // ❌ 报错:A012608110056 已存在


二、问题根因

你在同一个实体对象上,先 save(更新),再改 flow_no,再 save(插入)。

这里有个关键点:JPA 的 save() 不会因为 setId(null) 就把对象从持久态变成脱管态!

java

// 1. OldData 是从数据库查出来的 → 处于【持久态】
OldData = repository.findByFlowNo(\”XG01A012608110049\”);

// 2. 修改并保存 → OldData 依然是【持久态】
OldData.setIsDeleted(1);
repository.save(OldData); // 执行 UPDATE,OldData 还是被 JPA 管理的

// 3. 修改 flow_no → JPA 认为你要更新这个持久态对象
OldData.setFlowNo(\”A012608110056\”); // ← 这里触发了 JPA 的\”变更跟踪\”

//

赞(0)
未经允许不得转载:网硕互联帮助中心 » 然后 jpa 报错Duplicate entry ‘A012608110056‘ for key
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!