Método equals

Pessoal, meu problema é meio confuso, pelo menos para mim, o que acontece é o seguinte:

Sempre que eu vou atualizar algum combobox do cadastro de uma pessoa, o meu selectOneMenu chama o converter e o converter chama o método equals certinho, só que observando o debug da execução do método equals eu percebo que tem algo errado, vou tentar exemplificar abaixo:

  • A cidade da pessoa cadastrada é A e eu quero atualizar para D;
  • A classe é modelo.cidade;
  • Quando entra no método equals, a primeira comparação é com a cidade A (visto que ela é a primeira da lista);
  • O valor de this esta certinho com os valores de D;
  • O valor de obj teria que receber A, mas não recebe certo, a classe por exemplo, que deveria ser modelo.cidade é modelo.cidade_$$_javassist_29;
  • Depois que faz toda a verificação de de obj e retorna novamente para o início do método equals e comparar com o segundo item da lista this continua com o valor de D, e obj agora recebe normalmente o valor de B, tudo certinho;
  • Depois que ele compara com D com B e vê que ainda não é o item que ele quer, ele vai e compara B com C;
  • Nesse momento, this continua com o valor de D e obj recebe os valores de C normalmente, com a classe exata e os valores perfeitos, depois que ele compara e vê que D não é igual a C, ele volta para o equals e dessa vez deveria comparar D com D;
  • Aí, this continua com o valor D e obj que deveria receber o valor de D, não recebe os valores exatos e a classe que deveria ser modelo.cidade é modelo.cidade_$$_javassist_30 e os outros valores do objeto todos recebem null;

Eu não sei se fui claro em minha explicação, se ficou alguma coisa mal explicada, por favor digam…

Segue abaixo meu converter e meu hashcode e equals da classe cidade …

Converter:

@FacesConverter(forClass = GerTbCidade.class)
public class GerTbCidadeConverter implements Converter{
	@Override
	public Object getAsObject(FacesContext arg0, UIComponent arg1, String valor) {
		if(valor==null)
			return null;
		
		try{
			GerTbCidadeDAO dao = new GerTbCidadeDAO(JpaUtil.getEntityManager());
			return dao.busca(Integer.parseInt(valor.toString().trim()));
		}catch(Exception e){
			System.out.println(e.getCause());
			System.out.println(e.getMessage());
			e.printStackTrace();
			return "";
		}
	}

	@Override
	public String getAsString(FacesContext arg0, UIComponent arg1, Object obj) {
		if(obj==null)
			return null;
		
		try{
			GerTbCidade o = (GerTbCidade) obj;
			return "" + o.getPkIdCidade().toString().trim();
		}catch(Exception e){
			return "";
		}
		
	}
}

hashCode:

@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((pkIdCidade == null) ? 0 : pkIdCidade.hashCode());
		return result;
	}

equals:

@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		GerTbCidade other = (GerTbCidade) obj;
		if (pkIdCidade == null) {
			if (other.pkIdCidade != null)
				return false;
		} else if (!pkIdCidade.equals(other.pkIdCidade))
			return false;
		return true;
	}