You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot主表ID无法保存到子表字段问题求助

问题:Caixa主表ID无法保存到CaixaMeiosPagamentos子表关联字段

我实现了public CaixaMovimentos createCaixaMovimentos(CaixaMovimentos caixaMovimentos)方法,但无法将主表Caixa的ID保存到子表CaixaMeiosPagamentos的关联字段中,尝试多种方案均无效。控制台日志显示Caixa的ID已正确获取(如输出id novo 4、id 4),但数据库中子表的关联字段为空。

相关实体类与服务类代码

Caixa 实体类

@Entity(name = "caixa")
public class Caixa {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    public String getEmpresaCnpj() {
        return empresaCnpj;
    }

    public void setEmpresaCnpj(String empresaCnpj) {
        this.empresaCnpj = empresaCnpj;
    }

    @JoinColumn(name = "empresa_cnpj", referencedColumnName = "cnpj", foreignKey = @ForeignKey(name = "fk_caixa_empresa_cnpj"))
    private String empresaCnpj;

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Column(name = "nome")
    private String nome;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

CaixaMeiosPagamentos 实体类

@Entity(name = "caixa_meios_pagamentos")
public class CaixaMeiosPagamentos {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "caixa_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "meios_pagtos_caixa"))
    private Caixa caixa;

    @JsonBackReference
    @ManyToOne
    @JoinColumn(name = "caixa_mov_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "meios_pagtos_caixa_mov"))
    private CaixaMovimentos caixaMovimentos;

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public BigDecimal getValorTotal() {
        return valorTotal;
    }

    public void setValorTotal(BigDecimal valorTotal) {
        this.valorTotal = valorTotal;
    }

    @Column( name = "descricao", nullable = false)
    private String descricao;

    @Column(name = "valor_total")
    private BigDecimal valorTotal;

    public Caixa getCaixa() {
        return caixa;
    }

    public void setCaixa(Caixa caixa) {
        this.caixa = caixa;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public CaixaMovimentos getCaixaMovimentos() {
        return caixaMovimentos;
    }

    public void setCaixaMovimentos(CaixaMovimentos caixaMovimentos) {
        this.caixaMovimentos = caixaMovimentos;
    }
}

MovimentosService 服务类

@Service
public class MovimentosService {

    private final MovimentosRepository  movimentosRepository;
    private final CaixaService caixaService;

    public MovimentosService(MovimentosRepository movimentosRepository, CaixaService caixaService) {
        this.movimentosRepository = movimentosRepository;
        this.caixaService = caixaService;
    }

    public List<CaixaMovimentos> getAllCaixasMovimentos() {
        return movimentosRepository.findAll();
    }

    public Optional<CaixaMovimentos> getCaixaMovimentosById(Long id) {
        return movimentosRepository.findById(id);
    }

    public List<CaixaMovimentos>getCaixaMovimentosByData(LocalDate dataInicial , LocalDate dataFinal) {
        List <CaixaMovimentos> caixaMovimentos = movimentosRepository.findByDataMovBetween(dataInicial, dataFinal);
        return caixaMovimentos;
    }

    public CaixaMovimentos createCaixaMovimentos(CaixaMovimentos caixaMovimentos){
        Optional<Caixa> existingCaixa = caixaService.findCaixaByCnpj(caixaMovimentos.getCaixa().getEmpresaCnpj());
        CaixaMovimentos newCaixaMov = new CaixaMovimentos();
        newCaixaMov.setDataMov(caixaMovimentos.getDataMov());
        newCaixaMov.setNomeUsu(caixaMovimentos.getNomeUsu());
        if( existingCaixa.isPresent() ) {
            System.out.println("id  " +existingCaixa.get().getId() );
            newCaixaMov.setCaixa(existingCaixa.get());
        }else {
            Caixa newCaixa = caixaService.createCaixa(caixaMovimentos.getCaixa());
            newCaixaMov.setCaixa(newCaixa);
        }
        newCaixaMov.setCaixaMeiosPagamentos(caixaMovimentos.getCaixaMeiosPagamentos());
        System.out.println("id novo " +  newCaixaMov.getCaixa().getId() );
        return movimentosRepository.save(newCaixaMov);
    };

    public Optional<CaixaMovimentos> updateCaixaMovimentos(long id, CaixaMovimentos caixaMovimentos) {
        return movimentosRepository.findById(id).map(movimento ->{
            movimento.setNomeUsu(caixaMovimentos.getNomeUsu());
            movimento.setCaixa(caixaMovimentos.getCaixa());
            movimento.setDataMov(caixaMovimentos.getDataMov());
            movimento.setCaixaMeiosPagamentos( caixaMovimentos.getCaixaMeiosPagamentos());
            return movimentosRepository.save(movimento);
        }) ;
    }

    public boolean deteleCaixaMovimentos(long id) {
        return movimentosRepository.findById(id).map( existingMovimento ->{
            movimentosRepository.delete(existingMovimento);
            return true;
        }).orElse(false);
    }
}

CaixaMovimentos 实体类

@Entity(name = "caixa_mov")
public class CaixaMovimentos {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(referencedColumnName = "id", foreignKey = @ForeignKey(name = "caixa_mov_caixa"))
    private Caixa caixa;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Caixa getCaixa() {
        return caixa;
    }

    public void setCaixa(Caixa caixa) {
        this.caixa = caixa;
    }

    public LocalDate getDataMov() {
        return dataMov;
    }

    public void setDataMov(LocalDate dataMov) {
        this.dataMov = dataMov;
    }

    @Column(name = "data_mov")
    private LocalDate dataMov;

    public String getNomeUsu() {
        return nomeUsu;
    }

    public void setNomeUsu(String nomeUsu) {
        this.nomeUsu = nomeUsu;
    }

    @Column(name = "nome_usu")
    private String nomeUsu;

    public Set<CaixaMeiosPagamentos> getCaixaMeiosPagamentos() {
        return caixaMeiosPagamentos;
    }

    public void setCaixaMeiosPagamentos(Set<CaixaMeiosPagamentos> caixaMeiosPagamentos) {
        this.caixaMeiosPagamentos = caixaMeiosPagamentos;
    }

    @OneToMany(mappedBy = "caixaMovimentos", fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    Set<CaixaMeiosPagamentos> caixaMeiosPagamentos;
}

相关截图

Navicat数据库中子表关联字段为空
Postman请求参数示例

内容的提问来源于stack exchange,提问作者Gilmar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 02:24:51