Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Column 'id' is duplicated in mapping for entity

Quando tento levantar o projeto, ele da erro como se o atributo id da classe Medico estivesse duplicado, mas não está

package med.voll.api.medico;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import med.voll.api.endereco.Endereco;
@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Medico {


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

    public Medico(DadosCadastroMedico dadosRequisicao) {
        this.nome = dadosRequisicao.nome();
        this.email = dadosRequisicao.email();
        this.crm = dadosRequisicao.crm();
        this.especialidade = dadosRequisicao.especialidade();
        this.endereco = new Endereco(dadosRequisicao.endereco());
    }
}
package med.voll.api.medico;


import org.springframework.data.jpa.repository.JpaRepository;

public interface MedicoRepository extends JpaRepository<Medico, Long> {
}
package med.voll.api.medico;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MedicoService {

    @Autowired
    private MedicoRepository medicoRespository;

    public void cadastrarMedico(Medico medico){
        medicoRespository.save(medico);
    }
}
package med.voll.api.controller;

import med.voll.api.endereco.Endereco;
import med.voll.api.medico.DadosCadastroMedico;
import med.voll.api.medico.Medico;
import med.voll.api.medico.MedicoService;
import org.springframework.beans.factory.annotation.Autowired;
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 MedicoService service;

    @PostMapping
    public void cadastrar(@RequestBody DadosCadastroMedico dadosRequisicao){
        service.cadastrarMedico(new Medico(dadosRequisicao));
    }

}
package med.voll.api.endereco;

import jakarta.persistence.Embeddable;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Embeddable
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Endereco {

    private Long id;
    private String logradouro;
    private String bairro;
    private String cep;
    private String numero;
    private String complemento;
    private String cidade;
    private String uf;

    public Endereco(DadosEndereco dados) {
        this.logradouro = dados.logradouro();
        this.bairro = dados.bairro();
        this.cep = dados.cep();
        this.uf = dados.uf();
        this.cidade = dados.cidade();
        this.numero = dados.numero();
        this.complemento = dados.complemento();
    }
}
3 respostas
solução!

Olá, João, tudo bem?

Percebi que você está integrando a classe Endereco na entidade Medico e como lá já existe um id, acaba ocorrendo esse erro. Acredito que não será necessário ter o atributo id na classe Endereco mas caso você decida continuar, altere o nome desse atributo que deve dar certo :)

Olá isadora, funcionou aqui tudo certinho, muito obrigado! Porém fiquei com uma dúvida... Caso fosse em outro tipo de aplicação, uma que não fosse a do curso em si, para resolver essa questão, bastaria fazer um relacionamento via JPA (many-to-one, one-to-many ou one-to-one) para solucionar esse probelma ?

Boa tarde João, td bem?

Vai dependender do que precisamos mas nesse caso que você trouxe, para funcionar do modo que você propôs precisaríamos mexer um pouco no código.

Ao invés de usarmos @Embeddable na classe Endereco, ela seria uma entidade a parte. E ao invés de usar @Embedded no atributo Endereco na entidade Medico, teríamos que mapear o relacionamento. O que significa que deixaríamos de integrar a classe Endereco na entidade Medico para usar relacionamentos de entidades a nosso favor.

Mas eu trago aqui um questionamento: será mesmo que faz sentido seguirmos esse tipo de modelagem para representarmos o endereço no código?

Bons Estudos :D