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
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.
[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.