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;
}