Pegar ID do JComboBox preenchido com dados do banco sem precisar alterar o seu valor

Olá, tenho um JComboBox que é preenchido com dados do banco, até ai tudo ok, nenhum erro.
O que eu quero é que quando o usuário for alterar os dados da tela que tenha esse JComboBox ele não precise alterar o item que está sendo exibo nele para poder pegar o ID.
Se o item não for alterado gera o erro:

class java.lang.String cannot be cast to class model.CategoriaModel (java.lang.String is in module java.base of loader ‘bootstrap’; model.CategoriaModel is in unnamed module of loader ‘app’)

Se alterar item do JComboBox funciona corretamente, porém, se não fizer nada nele é gerado o erro acima.

Exemplo:

**Tela Cadastro de Produtos **

Nome do produto: Guaraná 2 litros
Categoria: Refrigerante
Preço: 4,00
Quantidade: 10

O usuário chama a tela de produtos para alterar apenas o preço do produto de 4,00 para 4,50 e não altera mais nada, só o preço.

Código usado no projeto.

//Getters e Setters

public class CategoriaModel {

    private int catid;
    private String catdescricao;

    public CategoriaModel() {

    }

    public CategoriaModel(int catid) {
        this.catid = catid;
    }

    public CategoriaModel(int id, String descricao) {
        this.catid = id;
        this.catdescricao = descricao;
    }

    public int getCatid() {
        return catid;
    }

    public void setCatid(int catid) {
        this.catid = catid;
    }

    public String getCatdescricao() {
        return catdescricao;
    }

    public void setCatdescricao(String catdescricao) {
        this.catdescricao = catdescricao;
    }

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

Controle banco de dados

public class CategoriaControle {

    //carrega combo
    public List<CategoriaModel> getCarregaCombo() {
        strSQL = "select * from categoria order by catdescricao";
        try {
            List<CategoriaModel> lista = new ArrayList<>();
            pst = conexao.getConexao().prepareStatement(strSQL);
            rs = pst.executeQuery();

            while (rs.next()) {
                // criando o objeto CategoriaModel
                CategoriaModel categoria = new CategoriaModel();
                categoria.setCatid(rs.getInt("catid"));
                categoria.setCatdescricao(rs.getString("catdescricao"));

                // adicionando o objeto à lista
                lista.add(categoria);
            }
            rs.close();
            pst.close();
            return lista;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    //pesquisa categoria por codigo
    public CategoriaModel setCategoria(int codigo) throws Exception {
        strSQL = "select * from categoria where catid = ? order by catdescricao";
        pst = conexao.getConexao().prepareStatement(strSQL);
        pst.setInt(1, codigo);
        rs = pst.executeQuery();
        if (!rs.next()) {
            return null;
        }
        return new CategoriaModel(rs.getInt("catid"),
                rs.getString("catdescricao"));
    }
    
}

Tela Cadastro de Produtos

Códigos responsáveis pela manipulação dos dados

public class jifProduto extends javax.swing.JInternalFrame {

    private void getComboCategoria() {
        try {
            CategoriaControle categoria = new CategoriaControle();
            jcbCategoria.removeAllItems();

            categoria.getCarregaCombo().forEach((c) -> {
                jcbCategoria.addItem(c);
                jcbCategoria.setSelectedIndex(-1);
            });
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), getTitle(),
                    JOptionPane.ERROR_MESSAGE);
        }
    }

    private void setCarregaProdutos(int id) throws Exception {
        List<Produto> lista = new ProdutoControle().setCarregaProdutosPorCodigo(id);
        for (Produto pro : lista) {

            String categoria = String.valueOf(
                    new CategoriaControle().setCategoria(pro.getProcatid()));

            jcbCategoria.getModel().setSelectedItem(categoria);

            String fornecedor = String.valueOf(
                    new FornecedorControle().setFornecedor(pro.getProforid()));

            jcbFornecedor.getModel().setSelectedItem(fornecedor);
            
            jtfDescricao.setText(pro.getProdescricao());
            jftPreco.setText(String.format("%.2f", pro.getPropreco()));
            jftQuantidade.setText(String.valueOf(pro.getProquantidade()));            
        }
    }

    //coloca a Tela de Cadastros de Produtos no modo de edição dos dados
    private void jbtEditarDadosActionPerformed(java.awt.event.ActionEvent evt) {                                           

        if (jtbProduto.getSelectedRow() != -1) {
            try {
                int linha = jtbProduto.getSelectedRow();
                codigo = Integer.parseInt(jtbProduto.getValueAt(linha, 0).toString());
                setCarregaProdutos(codigo);
		inclusao = false;
                CardLayout cl = (CardLayout) jplGeral.getLayout();
                cl.show(jplGeral, "detalhes");
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null, "Erro: " + ex.getMessage());
            }

        } else {
            JOptionPane.showMessageDialog(null, "Selecione um registro da tabela para alteração.",
                    this.getTitle(), JOptionPane.INFORMATION_MESSAGE);

        }
    } 

    //salva as alterações feitas na Tela de Cadastros de Produtos
    private void jbtSalvarActionPerformed(java.awt.event.ActionEvent evt) {                                          
        String mensagem;
        try {
            if (validaCampos()) {
                Produto p = new Produto();
                p.setProdescricao(jtfDescricao.getText());
                p.setPropreco(Double.parseDouble(jftPreco.getText().replace(",", ".")));
                p.setProquantidade(Integer.parseInt(jftQuantidade.getText()));

                CategoriaModel c = (CategoriaModel) jcbCategoria.getSelectedItem();
                p.setProcatid(c.getCatid());


                if (inclusao) {
                    new ProdutoControle().Incluir(p);
                    mensagem = "Dados incluídos no sistema com sucesso.";
                } else {
                    p.setProid(codigo);
                    new ProdutoControle().Alterar(p);
                    mensagem = "Dados alterados no sistema com sucesso.";
                }
                JOptionPane.showMessageDialog(null, mensagem);
                CarregaJTable();
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro: " + e.getMessage(),
                    getTitle(), JOptionPane.ERROR_MESSAGE);
        }
    }                                                       

}

Colega, não precisa dar essa volta toda de remover itens e adicionar itens no combo.
O Swing é todo MVC, quase todos os componentes possuem uma interface Model.

Implemente seu próprio ComboBoxModel para o seu JComboBox e aí simplesmente renderize a sua lista de objetos CategoriaModel.