Ajuda com Hibernate avançado[RESOLVIDO]

3 respostas
Javabuntu
1. /** 
   2.      * Método que busca um objeto de um tipo no banco de dados. 
   3.      * 
   4.      * @param primaryKey Identificação do tipo no banco de dados. 
   5.      * @return Objeto buscado no banco de dados. 
   6.      */  
   7.     public T get(PK primaryKey) throws Exception {  
   8.         try {  
   9.             return (T) getSession().get(this.objClass, primaryKey);  
  10.         } catch (HibernateException exception) {  
  11.             throw new Exception(exception);  
  12.         }  
  13.     }
apesar dos coments, não sei se entendi o que faz este método, ele devolve um objeto de acordo com a chave primária??? mas a classe recebe um T genérico, independente do objeto passado, se eu tiver um objeto Pessoa e objeto Cachorro com mesmo PK primaryKey, qual seria retornado? posso estar falando muita asneira, mas é que to ficando louco de tanto estudo.... 2- E qual a diferença deste acima pra este, vi que foram usados os dois num código..
# public T load(final PK primaryKey) {  
#        try {  
#            return (T) this.getSession().load(this.objectClass, primaryKey);  
#        } catch (final HibernateException e) {  
#            throw convertHibernateAccessException(e);  
#        }  
#    }

3- O que significa este , significa que recebe um objeto e sua chave primária?

1. public abstract class HibernateGenericDAO<T, PK extends Serializable>...{}

[EDIT]RESOLVIDO [/EDIT]
Obrigado Gil.

3 Respostas

ddduran

Eu lhe aconselho primeiro a estudar um pouco mais Generics, mas vamos la

Quando você instanciar o seu DAO você vai informar a ele qual o tipo de Entity ele gerencia (Cachorro ou Pessoa) atraves do T, mas o que vai dizer mesmo a instancia de qual classe vai ser retornada é a classe que esta na sua variavel objClass, então ele tentará achar a tabela correspondente a classe, depois o registro no banco de dados que tem como PK a PK que você passou e retorna um objeto representando aquele registro

devo reforçar que um bom estudo de generics seria indispensavel

a diferença é que um espera que a instancia já exista (load) e o outro (get) caso ele não encontre encontre ele vai lhe retornar um objeto nulo

Significa que você vai definir na hora de instanciar o seu DAO com qual tipo de classes ele vai trabalhar, imagina se você fizer isso

DAO<Pessoa, Long> d = ...

todo lugar que tiver o T vai ser substituido por Pessoa e todo o lugar que tiver o PK vai ser substituido por Long

eu pessoalmente não uso esse PK extends Serializable, faço meus metodo ao inves de receber um PK receber logo um Serializable, mas sei que um monte de gente vai criticar isso :confused:

bom acho que é isso

R

Você deveria estudar o capítulo de Generics do JSE 5.0

Vou começar de trás pra frente.

O HibernateGenericDAO<T, PK extends Serializable> significa que a classe declarada poderá ser “tipada” para um tipo T qualquer (Pessoa, Cachorro, Gato, Carro), e outro tipo que seja no mínimo subclasse de Serializable. O GenericDAO usa assim, pq a PK do Hibernate sempre deve ser Serializable.

Sobre os métodos get e load, repare que eles retornam um tipo genérico T. Quando você “tipar”, os métodos retornarão o tipo que vc escolheu. Exemplo:

ORAHibernateGenericDAO<Pessoa, PessoaPK> ora = new ORAHibernateGenericDAO<Pessoa, PessoaPK> ();

Na declaração acima, estou entendendo que foi criada uma subclasse concreta de HibernateGenericDAO (que é abstrata). Daí, instanciei um objeto que “tipa” a classe para Pessoa e PessoaPK. Assim, sempre que você chamar get ou load, eles retornarão tipo Pessoa, e usarão a pk do tipo PessoaPK.

Javabuntu

RESOLVIDO.

Criado 2 de outubro de 2007
Ultima resposta 2 de out. de 2007
Respostas 3
Participantes 3