新建角色时出现javax.persistence.EntityNotFoundException异常如何解决
异常排查与解决方案
实体定义侧排查
- 校验
Roles实体的主键生成策略:确认@GeneratedValue配置和数据库表主键的生成规则匹配,使用GenerationType.IDENTITY时必须开启表主键自增,使用序列策略时必须确认数据库存在对应序列且权限配置正确。 - 移除
Roles实体上的@Where、@Filter等软删除过滤注解临时测试,如果异常消失,说明是插入后查询触发了过滤规则,需调整全局查询过滤的生效范围。 - 检查所有关联字段的
@ManyToOne、@OneToOne配置,若存在optional = false的配置,插入前需校验关联实体是否真实存在,JPA在校验关联存在性时会抛出本异常而非关联实体不存在的提示。
业务逻辑侧排查
- 确认保存方法全程在事务内运行,无手动回滚、异常捕获后未回滚的问题:事务未提交前执行
getReference()查询未flush的实体,会直接抛出EntityNotFoundException,临时将查询方法替换为find()可验证该问题。 - 排查是否存在全局插入监听器、拦截器在插入后修改了实体的主键值:JPA会使用插入前生成的主键做后续查询,主键被修改会导致查询不到对应记录。
- 检查保存逻辑中是否存在先删除同主键记录、再插入新记录的操作:操作间隔过短会导致JPA缓存和数据库状态不一致,触发查询时抛出异常。
基础设施侧排查
- 确认角色表无插入后修改主键的触发器:触发器修改主键会导致JPA缓存的主键和数据库实际值不匹配。
- 若使用读写分离架构,确认保存后的查询操作强制走主库:主从同步延迟会导致从库暂时查不到刚插入的记录。
内容的提问来源于stack exchange,提问作者Axel Bauduin
相关产品推荐
相关产品推荐

