标注@Transient的idMoneda属性无法更新到数据库问题咨询
问题根因与解决方案
核心问题说明
- @Transient 注解标注的字段不会被JPA纳入持久化逻辑,数据库中存储的是
moneda关联属性对应的外键字段,你当前的setIdMoneda方法仅对临时的idMoneda变量赋值,没有同步更新关联的Moneda实体对象,JPA感知不到关联关系的变化,因此外键字段一直为null。 - 现有
getIdMoneda方法存在空指针风险,当moneda为null时调用moneda.getId()会直接抛出NPE。
修复步骤
1. 修正get/set方法逻辑
修改idMoneda的存取逻辑,确保set方法同步更新关联的moneda属性,get方法做空值兼容:
// 实体类内部调整get/set逻辑 public Long getIdMoneda() { // 空值兼容避免NPE return this.moneda != null ? this.moneda.getId() : null; } public void setIdMoneda(Long idMoneda) { this.idMoneda = idMoneda; // 新增逻辑:同步更新关联的moneda属性 if (idMoneda == null) { this.moneda = null; return; } }
如果不方便在实体类中注入持久层组件,直接在业务逻辑层(Service层)处理关联即可:
// Service层保存/更新逻辑示例 @Transactional public Remesa saveRemesa(Remesa remesaFromRequest) { Long idMoneda = remesaFromRequest.getIdMoneda(); if (idMoneda != null) { // 从Moneda仓库查询对应实体,设置到Remesa对象中 Moneda moneda = monedaRepository.findById(idMoneda).orElse(null); remesaFromRequest.setMoneda(moneda); } return remesaRepository.save(remesaFromRequest); }
2. 额外校验项
- 确认传入的
idMoneda在Moneda表中存在对应记录,避免外键约束报错 - 确认你的保存/更新方法上添加了
@Transactional注解,确保事务正常提交
内容的提问来源于stack exchange,提问作者efejdlek
相关产品推荐
相关产品推荐

