Olá, não tenho certeza se esse é o local certo para postar, então desculpem qualquer coisa
Minha dúvida é a seguinte…
Tenho uma classe com o seguinte método:
public void pesquisar()
{
HibernateUtil.pesquisar(this);
}
Método que ele chama:
public static void pesquisar(Object entrada)
{
Session sessao = null;
Transaction transacao = null;
Criteria filtro = null;
//código da pesquisa
entrada = entrada.getClass().cast(resultado); //resultado é do tipo Object e recebe o resultado da chamada no método Criteria.uniqueResult()
//resto do código
}
A Instância da entidade que chamou o método HibernateUtil.pesquisar não recebe os valores da pesquisa…o jeito que eu consegui fazer funcionar foi fazendo o método retornar o valor da variável resultado, mas então o código da minha entidade ficou algo assim:
@Entity
public class Contato implements Serializable
{
private static final long serialVersionUID = -1709644651136614756L;
@Id
@GeneratedValue
private Integer codigo;
private String email;
private String telefone1;
private String telefone2;
public void pesquisar(){
Contato contato = HibernateUtil.pesquisar(this);
email = contato.email;
//etc
}
//resto
O que não me parece um código “limpo”.
A variável entrada não deveria ter o mesmo endereço de memória que a instância que chamou o método HibernateUtil.pesquisar? Em que parte estou me confundindo?
Não faço idéia se o problema é muito simples ou não, já que só estou começando a aprender java, de qualquer forma…Obrigado pela ajuda.
Veja, para o Hibernate existe diferença entre “identidade” do objeto, e “identidade” de banco de dados, quando você compara dois objetos usando o método equals, você está usando o conceito de “identidade” de objetos, e você pode ter dois objetos em espaços de memória diferentes sendo “considerados” objetos iguais!!!
Então para as coisas ficarem melhores vamos separar a abordagem entre identidade de objetos java e identidade de objetos para o framework Hibernate.
Java:
Se quer saber se dois objetos estão na mesma posição de memória:
obj1 == obj2
Se quer saber se dois objetos são “considerados” iguais
obj1.equals(obj2)
Existe algumas dúvidas quanto ao hashcode e equals porém esse post pode ajudar muito no entendimento
http://www.guj.com.br/java/212741-scjp-duvida-hashcode-e-equals/2
Já para o Hibernate o conceito de identidade é diferente, logo voce não precisa que o objeto seja o mesmo que está na mesma posição de memória, e sim que os valores da chave primária sejam o mesmo!, desta forma se voce passar uma entidade com os valores da chave iguais, ele vai identificar no banco o objeto que possue essa identidade…
Desta forma voce poderia ter seu metodo pesquisar recebendo um Contato, e devolvendo um Contato, e na verdade não precisa nem estar ai… poderia estar em um Repository ou DAO, mas se quiser deixar ae pode mudar para algo assim:
public Contato pesquisar(Contato contato){
return Hibernate.pesquisar(contato);
}
se você criar um Contato e fizer
contato.setCodigo(1);
objContato.pesquisar(contato);
Voce está passando o contato com a identidade 1 para a chave codigo, ou seja ele vai verificar pela identidade(chave) e não pelo endereço de memória…
Att.
Obrigado pela resposta, acabei optando por criar a classe ContatoDAO mesmo, o que eu estava pensando não parece possível de forma elegante.