Ha uns meses atras eu tive um problema com uma combo e motivo do problema era a falta de um equals na classe. As vezes quando a pagina era renderizada o objeto que estava selecionado era de uma instancia diferente do correspondente da lista e com isso dava inconsistencia.Por este motivo todas as classes precisam do equals e hashcode implementado e o eclipse gera eles automaticamente. Mas ontem eu tive um problema com este equals gerado de maneira automatica, pois ele gera o equals dessa maneira: @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; UsuarioLogin other = (UsuarioLogin) obj; if (idUsuario != other.idUsuario) return false; return true; }Este equals pode gerar dois problemas em nosso ambiente por conta de como o hibernate trabalha. O hibernate cria constantemente classes em tempo de execucao que herdam das classes da entidade e adicionam metodos que ele precisa. Voces que trabalharam com Hibernate ja devem ter visto Objetos com classes estranhas como br.com.infox.cliente.entity.Pessoa_$$_javassist_26.O primeiro problema e que como sao classes diferentes esta comparacao sempre retorna false: if (getClass() != obj.getClass()). Para resolver deve-se testar com instanceof.O segundo problema e o acesso aos campo da entidade. As vezes mesmo campos que nao sao lazy, so sao populados quando sao chamados pelo get do campo, entao a comparacao (idProcesso != other.idProcesso) pode retornar false, pois o valor pode nao estar populado ainda.Eu tive esse dois problemas ontem com a classe UsuarioLogin, e perdi um bom tempo para descobri isso.Para tornar nosso equals das entidades compativeis com o hibernate podemos reescrever ele assim: @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof UsuarioLogin)) return false; UsuarioLogin other = (UsuarioLogin) obj; if (getIdUsuario() != other.getIdUsuario()) return false; return true; } Maiores explicacoes sobre estes problemas podem ser lidas aqui: http://blog.xebia.com/2008/03/advanced-hibernate-proxy-pitfalls/ Em uma consulta HQL quanto projetamos mais que um objeto, o mais comum e acessarmos a consulta por um List<Object[]> essa abordagem nao e muito interessante, pois torna nossa consulta muito passivel de dar erro, pois basta mudar a ordem das colunas e vamos causar um erro onde a consulta estiver sendo usada. String hql = "select o.numeroProcesso, o.dataInicio from Processo o"; Query query = EntityUtil.createQuery(hql); List<Object[]> list = query.getResultList();Uma abordagem mais interessante e devolver essa consulta como um List<Map<String, Object>> criando os alias paras as colunas projetadas. Dessa maneira uma mudanca de ordem na consulta nao traria erro para quem a utilizasse: String hql = "select new map(o.numeroProcesso as numeroProcesso, o.dataInicio as dataInicio) from Processo o"; Query query = EntityUtil.createQuery(hql); List<Map<String, Object>> list = query.getResultList(); for (Map<String, Object> map : list) { Object numeroProcesso = map.get("numeroProcesso"); }A utilizacao do List<Map<String, Object>> e um avanco, mas pode induzir a erros de runtime, pois o cast fica sobre responsabilidade de quem for utilizar a lista.Uma maneira mais segura e utilizar o recurso de instanciacao do bean via construtor. O hibernate permite que instanciemos em nossa consulta uma classe que as colunas projetadas sejam