Dúvidas em Classe DAO Hibernate

Galera, estou iniciando em hibernate agora!

Segui vários tutoriais, de vário sites na net e pelo que vi todos optam por um certo padrao DAO!

Os exemplos básicos que li na net, pelo que vi sempre criavam uma DAO pra cada classe por exemplo: PessoaDAO, PessoaFisicaDAO, PessoaJuridicaDAO, ClienteDAO.

Observei na internet que muitos lugares mencionam classes DAO genéricas!

Outra duvida que me surgiu é, a sessao deve ser criada dentro da classe DAO, ou passada como um parametro para classe DAO? metodos como load precisam que a sessoa estejam abertas!

Estou iniciando, mas gostaria de comecar da melhor maneira para n sobrar vicios, ou evoluir erradamente, tente criar uma classe DAO generica, segue a mesma abaixo! Quero opinioes de como melhora-la para chegar no seu ideal, ou se estou seguindo alguma abordagem errada!

Desde já agradeço!

[code]import java.io.Serializable;

import org.hibernate.*;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

public class GenericDao<T> {
private Session session;

private Class persistentClass;

private SessionFactory factory;

public GenericDao() {

}

public GenericDao(Session session) throws Exception {

	this.session = session;

}

public GenericDao(Class persistentClass) throws Exception {

	this.factory = new Configuration().addClass(persistentClass)
			.buildSessionFactory();
	this.session = this.factory.openSession();
	this.persistentClass = persistentClass;

}

public GenericDao(Session session, Class persistentClass) throws Exception {

	this.session = session;
	this.persistentClass = persistentClass;

}

@SuppressWarnings("unchecked")
public T search(Serializable id) {
	return (T) session.load(persistentClass, id);
}

public void insert(T object) throws Exception {
	Transaction tx = this.session.beginTransaction();
	session.save(object);
	session.flush();
	tx.commit();
}

public void update(T object) throws Exception {
	Transaction tx = this.session.beginTransaction();
	session.update(object);
	session.flush();
	tx.commit();
}

public void delete(T object) throws Exception {
	Transaction tx = this.session.beginTransaction();
	session.delete(object);
	session.flush();
	tx.commit();
}

}[/code]

Sugiro vc dividir a parte de SessionFactory da parte de DAO… são coisas diferentes para propositos diferentes. Uma visa levantar seu ORM e outra trabalhar com seus dados.

E quanto a classes genericas, existem diversas no google. A Java Magazine tb fez uma reportagem muito boa na penultima edição sobre isso… Como contruir objetos de negocio, ou algo parecido…

deixe a criação do session factory em outra classe.

Recupere a sessão dentro do construtor. Não precisa recebê-la como parâmetro.

Outra opção, diferente da dada pelo amigo acima, é ter todos os métodos estáticos da SessionFactory e ir chamando-os dentro dos seus métodos. Coloque ThreadLocal sempre que quizer guardar algum objeto que vc possa utilizar em vários métodos em conjunto, como a sessão (Session) e a transação (Transaction).
Esta é até a implementação que o pessoal do Hibernate aconselha.

da uma olhada aqui
http://www.guj.com.br/posts/list/72576.java

acho que vai te ajudar muito ler toda a thread

agora quanto ao seu dao, como foi dito faça somente um construtor onde ele recebe a classe e a Session, não o SessionFactor.

outra coisa não crie nem commit transações no seu DAO, isso te impossibilitaria de por exemplo fazer duas ações em uma unica transação (o que é a função dela)
por exemplo você nao conseguiria inserir um cliente e um contato do cliente em uma unica transação

[quote=rodrigoallemand]Sugiro vc dividir a parte de SessionFactory da parte de DAO… são coisas diferentes para propositos diferentes. Uma visa levantar seu ORM e outra trabalhar com seus dados.

E quanto a classes genericas, existem diversas no google. A Java Magazine tb fez uma reportagem muito boa na penultima edição sobre isso… Como contruir objetos de negocio, ou algo parecido…[/quote]

Boaz…
Sabe qual é o numero da edição de Java Magazine que tratou sobre as classes de negocio?

Até!