Esse erro não é do java, é uma excessão do sql.
Veja, quando você criou banco de dados, disse que a entidade cidade se relaciona com a entidade estado.
E este relacionamento se dá por meio de uma chave estrangeira.
Se você abrir o banco de dados e olhar o id de cada estado vai ver que pode não ser o mesmo passado pelo comboEstado.getSelectedIndex();
O erro está aí.
O combobox.getSelectedIndex vai de 0 a 26 por serem 26 estados e um distrito federal.
Embora os “estados” sejam 27, o getSelectedIndex se refere ao index do combobox não ao id do estado existente no banco de dados:
Ou seja, o combo.getSelectedIndex() não está associado ao id do estado constante no banco de dados.
Assim, a implementação de sua aplicação está indiretamente trabalhando com probabilidade e não com lógica, este é o problema.
Quais as soluções?
1: o combobox trabalha com generics.
Problema: não dá pra ensinar isto por aqui, mas é bem básico.
JCombobox<Estado> comboEstado = new JComboBox<>();
Aí você tem que sobrescrever o método toString();
@override
public toString(){
return estado.getNome();
}
Quando você for fazer a persistência você usa por exemplo:
Estado estado = comboEstado.getSelectedItem();
Depois cidade.setEstado(estado);
Ocorre que seu JCombobox<String> é diferente de um JCombobox<Estado>.
Veja, no primeiro caso o comboEstado.getSelectedItem() retorna uma String.
No segundo caso o comboEstado.getSelectedItem() retorna um estado, ou seja, são retornos diferentes por meio do generics.
Isto nos coloca na segunda opção: a gambiarra.
Você pode criar um List.
Assim à medida em que você popular o combobox você popular o List listEstados.
Exemplo:
comboEstado.addItem(estado.getNome());
listEstado.add(estado);
Quando você for persistir você pode pegar o estado pela lista é não pelo combobox.
Assim no lugar de fazer combo.getSelextedIndex(), você faz:
Estado estado = listCidades.get(comboEstado.getSelectedIndex());
Cidade cidade.setEstado(estado);
…
Lembrando que QUALQUER implementação sem generics é uma gambiarra em minha concepção 