Método Equals

Tenho uma Super classe pessoa e uma classe filha representante, preciso rescrever o metodo equals e está ocorrendo um erro.

Pessoa

@Entity
@Table(name="PESSOAS")
@Inheritance(strategy = TABLE_PER_CLASS)
@MappedSuperclass
public class Pessoa implements Serializable {

	private static final long serialVersionUID = 5743696681667477943L;
	
	private String codigo;
...
        @Id
	public String getCodigo() {
		return codigo;
	}
        public void setCodigo(String codigo) {
		this.codigo = codigo;
	}
}

Pessoa Juridica

@MappedSuperclass
public abstract class PessoaJuridica extends Pessoa implements Serializable {
...
}

Representante

@Entity
@Table(name = "REPRESENTANTES")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Representante extends PessoaJuridica {
    
       .....

        @Override
	public boolean equals(Object obj) {
		
		if(obj == null){
			return false;
		}
		
		if (getCodigo().equals(((Representante) obj).getCodigo())) {
			return true;
		} else {
			return false;
		}
	}
	
	@Override
	public int hashCode() {

		return getCodigo().hashCode();
	}
]

Erro :

11:00:27,187 ERROR [BasicPropertyAccessor] IllegalArgumentException in class: br.com.model.legado.cadastros.pessoa.Pessoa, getter method of property: codigo
11:00:27,212 SEVERE [application] javax.ejb.EJBException: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of br.com.model.legado.cadastros.pessoa.Pessoa.codigo
javax.faces.el.EvaluationException: javax.ejb.EJBException: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of br.com.model.legado.cadastros.pessoa.Pessoa.codigo

Outro erro no mesmo local :

11:15:47,167 WARNING [lifecycle] java.lang.String cannot be cast to br.com.model.legado.cadastros.pessoa.Representante
java.lang.ClassCastException: java.lang.String cannot be cast to br.com.cadastros.pessoa.Representante
	at br.com.model.legado.cadastros.pessoa.Representante.equals(Representante.java:71)
	at br.com.easyfaces.component.UISelectOneMenu.validateValue(UISelectOneMenu.java:26)

Representante

@Override
	public boolean equals(Object obj) {
		
		if(obj == null){
			return false;
		}
		
		if (getCodigo().equals(((Representante) obj).getCodigo())) { // linha 71
			return true;
		} else {
			return false;
		}
	}

Tente fazer o casting de Object para Representante fora do if. Dessa forma:

Representante rep = (Representante)obj;

E depois entre no IF:

@Override  
    public boolean equals(Object obj) {  
        Representante rep = (Representante)obj;          
        if(obj == null){  
            return false;  
        }  
          
        if (this.getCodigo().equals(rep.getCodigo())) { // linha 71  
            return true;  
        } else {  
            return false;  
        }  
    }

Espero ter ajudado!

;D

Não resolveu …

Se vc estiver no Eclipse ele gera o equals pra vc.

Botão direito > Source > Generate hashCode() and equals().

Daí vc pode comparar e ver onde errou…

Muito Obrigado caio_sope, com a declaração gerada pelo eclipse funcionou perfeitamente!

Código

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

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

Eu não tinha validado o codigo, caso 2 objetos tivessem codigos = nulos seriam iguais. Isso mesmo wellington.nogueira ?

hummm, entendi agora, sempre usar == em vez de equals quando o objeto puder ser nulo , isso mesmo ?

Não é bem assim. Você usa “==” quando você quer checar se a variável ou parâmetro é null ou não. Se não for null, use equals.

hummm …

[quote=ddark.emanu]Muito Obrigado caio_sope, com a declaração gerada pelo eclipse funcionou perfeitamente!

[/quote]Mas você entendeu o que você errou?

[quote=ddark.emanu]Eu não tinha validado o codigo, caso 2 objetos tivessem codigos = nulos seriam iguais. Isso mesmo wellington.nogueira ?[/quote]Se getCodigo() retornasse nulo, você receberia um NullPointerException exceto se você usasse == para fazer a comparação.