Hybris中ModelService.save(dispute)执行后数据库记录被删除问题
记录更新后被删除的可能原因及排查方案
结合你提供的代码和场景,以下是几个可能导致记录被删除的原因及对应的排查方向:
1. modelService.save()方法的行为不符合预期
很多ORM框架(如Spring Data JPA)中,save()方法的逻辑依赖于实体的持久态状态:
- 如果
getDisputeDetails方法返回的是游离态实体(比如通过JDBC手动查询、脱离了Session/EntityManager管理的实例),save()可能会将其当作新实体执行插入操作。若数据库主键策略允许重复(或存在逻辑覆盖),可能导致原有记录被意外处理,甚至触发某些删除逻辑。 - 排查方式:
- 查看
modelService.save()的具体实现,确认内部是执行UPDATE还是INSERT语句; - 若使用Spring Data JPA,可替换为
saveAndFlush()强制立即执行,并观察SQL日志。
- 查看
2. 逻辑删除字段被误触发
检查AviationDisputeModel实体类是否包含逻辑删除相关字段(如deleteFlag、isDeleted):
- 可能在
save方法内部有自动填充逻辑,或者在修改其他字段时,无意中触发了该字段的变更(比如通过反射、AOP切面等),导致记录被标记为删除而非更新。 - 排查方式:
- 在
modelService.save(dispute)前后打印dispute的所有字段值,重点检查逻辑删除字段的状态; - 查看实体类的字段注解,确认是否有自动填充逻辑。
- 在
3. 数据库层面的触发器/存储过程问题
如果数据库表配置了触发器,当更新DisputeStatus、ResolutionCode这类字段时,可能触发了错误的删除逻辑:
- 比如触发器中错误地将
UPDATE操作关联了DELETE语句,导致更新时原有记录被删除。 - 排查方式:
- 查看对应数据库表的触发器定义;
- 直接在数据库中手动执行更新语句,观察记录是否会被删除。
4. 事务上下文的关联操作
当前操作所在的事务中,可能存在其他未被注意到的DAO操作:
- 比如在同一个事务内,先查询记录,后续其他代码执行了删除该记录的操作,事务提交时最终执行了删除。
- 排查方式:
- 检查当前方法所在的事务边界,查看是否有其他关联的服务调用;
- 开启事务日志,跟踪事务内的所有数据库操作。
5. getDisputeDetails方法返回的实体异常
确认getDisputeDetails方法是否真的返回了数据库中存在的记录:
- 如果该方法在
DispId不存在时,返回的是一个新创建的AviationDisputeModel实例而非null,那么后续的save()会插入新记录,而原有记录可能因其他业务逻辑被删除。 - 排查方式:
- 在获取
dispute后,打印其主键值,并与数据库中对应记录的主键对比,确认是同一记录; - 查看
getDisputeDetails的实现逻辑,确认无异常返回。
- 在获取
你提供的代码:
AviationDisputeModel dispute = aviationDisputeService.getDisputeDetails(resolveDisputeDetails.get("DispId").toString()); if (Objects.nonNull(dispute) && StringUtils.isNotEmpty(String.valueOf(resolveDisputeDetails.get("DispId"))) && StringUtils.isNotEmpty(String.valueOf(resolveDisputeDetails.get("DspStat"))) && StringUtils.isNotEmpty(String.valueOf(resolveDisputeDetails.get("RES_CODE")))) { try { dispute.setDisputeStatus((resolveDisputeDetails.get("DspStat").toString())); dispute.setResolutionCode(resolveDisputeDetails.get("RES_CODE").toString()); dispute.setDisputeCategory(resolveDisputeDetails.get("RES_CODE").toString()); dispute.setResolutionCategory(resolveDisputeDetails.get("RES_CODE").toString()); modelService.save(dispute); return "SUCCESS"; } catch (Exception e) { LOG.error("Error while resolving Dispute" + e.getMessage()); return "FAILURE"; } }
内容的提问来源于stack exchange,提问作者siddarth
相关产品推荐
相关产品推荐

