Erro ao fazer Cast

Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: class java.lang.String cannot be cast to class model.MedicoEspecializacao (java.lang.String is in module java.base of loader ‘bootstrap’; model.MedicoEspecializacao is in unnamed module of loader ‘app’).

Novo Medico JInternalFrame

  public NovoMedico() {

       jComboBoxEsp.removeAllItems();

      MedicoDAO medDao=new MedicoDAO();
      List<MedicoEspecializacao> list=medDao.finAll();

       for(MedicoEspecializacao item: list){

               jComboBoxEsp.addItem(item.getEspecialidade());
          }
       
private void jButtonSalvarActionPerformed(java.awt.event.ActionEvent evt) {                                              
        // TODO add your handling code here:
        Medico med=new Medico();
        MedicoDAO medDao=new MedicoDAO();
        MedicoEspecializacao esp=new MedicoEspecializacao();
       
        med.setNomeMedico(jTextFieldMedico.getText());
        med.setUF((String) jComboBoxUF.getSelectedItem());
        med.setMunicipio((String) jComboBoxMun.getSelectedItem());
        med.setCrm(jTextFieldCRM.getText());
        med.setMedEsp((MedicoEspecializacao) jComboBoxEsp.getSelectedItem()); <-- Erro está aqui !!!
        medDao.salvar(med);
        
    
        
    }   

Classe Medico

@Entity
public class Medico  {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nomeMedico;
private String UF;
private String municipio;
private String crm;
@ManyToOne
private MedicoEspecializacao medEsp;

    public Medico() {
    }

    public Long getId() {
        return id;
    }

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

    public String getNomeMedico() {
        return nomeMedico;
    }

    public void setNomeMedico(String nomeMedico) {
        this.nomeMedico = nomeMedico;
    }

    public String getUF() {
        return UF;
    }

    public void setUF(String UF) {
        this.UF = UF;
    }

    public String getMunicipio() {
        return municipio;
    }

    public void setMunicipio(String municipio) {
        this.municipio = municipio;
    }

    public String getCrm() {
        return crm;
    }

    public void setCrm(String crm) {
        this.crm = crm;
    }

    public MedicoEspecializacao getMedEsp() {
        return medEsp;
    }

    public void setMedEsp(MedicoEspecializacao medEsp) {
        this.medEsp = medEsp;
    }
  
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 67 * hash + Objects.hashCode(this.id);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Medico other = (Medico) obj;
        if (!Objects.equals(this.id, other.id)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Medico{" + "id=" + id + ", nomeMedico=" + nomeMedico + ", UF=" + UF + ", municipio=" + municipio + ", crm=" + crm + ", medEsp=" + medEsp + '}';
    }
    
    
}

MedicoDao

  public Medico salvar(Medico med)
    {
    EntityManager em = new JPAUtil().getConnection();
        try {
            em.getTransaction().begin();
            if (med.getId() == null) {
                em.persist(med);
            } else {
                em.merge(med);
            }
            em.persist(med);
            em.getTransaction().commit();
            em.close();

        } catch (Exception e) {
            System.err.println(e);
            em.getTransaction().rollback();
        } finally {
            em.close();
        }
        return med;
    }
    
      public List<MedicoEspecializacao> finAll() {
        EntityManager em = new JPAUtil().getConnection();
        List<MedicoEspecializacao> medicosEsp = null;
        try {
            medicosEsp = em.createQuery("from MedicoEspecializacao m").getResultList();

        } catch (Exception e) {
            System.err.println(e);
        } finally {
            em.close();
        }
        return medicosEsp;
    }

Você populou o jComboBoxEsp com objetos String.

String e MedicoEspecializacao não tem nenhuma relação hierárquica, não faz sentido você tentar fazer cast de String para MedicoEspecializacao.

Implementa o seu próprio ComboboxModel para renderizar a lista de MedicoEspecializacao.

Já resolvi de outro jeito

List list=medDao.findAll();
for(MedicoEspecializacao item: list){
combobox.addElement(item);
}

e na classe Medico Especialização

@Override
public String toString() {
return especialidade;
}

1 curtida

Se tivesse implementado um ComboBoxModel, não precisaria desse laço e nem sobrescrever o toString(), lembre-se que os componentes do Swing são MVC, então toda vez que você não usa um Model para o componente, estará fazendo gambiarra.
🤷