1
resposta

[Bug] Problema em mandar os dados para o banco de dados

Estou usando o Postgresql no meu projeto, porem toda vez que eu tento enviar os dados recebo o seguinte erro:

ERRO: null value in column "nome" of relation "medicos" violates not-null constraint Detalhe: Registro que falhou contém (16, null, rodrigo.ferreira@voll.med, 123456, ORTOPEDIA, rua 1, bairro, 12345678, complemento, 1, DF, Brasilia).

E eu não estou conseguindo achar onde esta o erro

Classe medico:

package med.voll.api.medicos;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import med.voll.api.endereco.Endereco;

@Table(name = "medicos")
@Entity(name = "Medico")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Medico {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private String nome;
  private String email;
  private String crm;
  @Enumerated(EnumType.STRING)
  private Especialidade especialidade;
  @Embedded
  private Endereco endereco;

  public Medico(DadosDeCadastro medico) {

      this.nome = medico.nome();
      this.email = medico.email();
      this.crm = medico.crm();
      this.especialidade = medico.especialidade();
      this.endereco = new Endereco(medico.endereco());

  }
}

Classe MedicoController:

package med.voll.api.controller;

import med.voll.api.medicos.DadosDeCadastro;
import med.voll.api.medicos.Medico;
import med.voll.api.medicos.MedicoRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/medicos")
public class MedicoController {

    @Autowired
    private MedicoRepository repository;

    @PostMapping
    @Transactional
    public void retorno(@RequestBody DadosDeCadastro medico){
        repository.save(new Medico(medico));
    }
}

Arquivo SQL:

create table medicos(

    id  SERIAL PRIMARY KEY,
    nome varchar(100) not null,
    email varchar(100) not null unique,
    crm varchar(6) not null unique,
    especialidade varchar(100) not null,
    logradouro varchar(100) not null,
    bairro varchar(100) not null,
    cep varchar(9) not null,
    complemento varchar(100),
    numero varchar(20),
    uf char(2) not null,
    cidade varchar(100) not null
);
1 resposta

Sua Classe medico nao teria que ter um id? Assim?

@Entity(name = "Medico")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Medico {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id; // Chave primária gerada automaticamente

  private String nome;
  private String email;
  private String crm;
  @Enumerated(EnumType.STRING)
  private Especialidade especialidade;
  @Embedded
  private Endereco endereco;

  public Medico(DadosDeCadastro medico) {
      this.nome = medico.nome();
      this.email = medico.email();
      this.crm = medico.crm();
      this.especialidade = medico.especialidade();
      this.endereco = new Endereco(medico.endereco());
  }
}

O problema parece estar na definição da classe Medico, onde você declarou o campo nome como uma chave primária (@Id) e configurou-o para ser gerado automaticamente com @GeneratedValue. No entanto, a chave primária geralmente é usada para armazenar valores exclusivos e não deve ser gerada automaticamente no caso de um campo como "nome". Em vez disso, você deve configurar um campo como "id" para ser a chave primária e gerado automaticamente.