Hibernate Utils genérico. Como fazer?

Pessoal estou precisando criar uma classe HibernateUtils genérica, de forma que eu consiga obter uma session para qualquer classe do meu sistema.

Estava estudando um exemplo que encontrei na apostila da Caelum, mas ele só funciona pra uma classe e não para todas como eu preciso. Seguem mais detalhes:

Esse é o exemplo encontrado na apostila fj21 da Caelum.

[code]public class HibernateUtil {
private static SessionFactory factory;

 static {
           AnnotationConfiguration cfg = new AnnotationConfiguration();
           cfg.addAnnotatedClass(Produto.class);
           factory = cfg.buildSessionFactory();
 }
 public Session getSession() {
           return factory.openSession();
 }

}[/code]
Tentei fazer algo mais genérico dessa forma:

[code]public class HibernateUtil {

private static SessionFactory factory;

public Session getSession(Class classe) {
	AnnotationConfiguration cfg = new AnnotationConfiguration();
	cfg.addAnnotatedClass(classe);
	factory = cfg.buildSessionFactory();
	return factory.openSession();
}

}[/code]
Porém não obtive sucesso pois sempre é lançada a Exception:

11:24:30 INFO [Version] Hibernate Annotations 3.5.0-Final 11:24:30 INFO [Environment] Hibernate 3.5.0-Final 11:24:30 INFO [Environment] hibernate.properties not found 11:24:30 INFO [Environment] Bytecode provider name : javassist 11:24:30 INFO [Environment] using JDK 1.4 java.sql.Timestamp handling 11:24:30 INFO [Version] Hibernate Commons Annotations 3.2.0.Final 11:24:31 INFO [HibernateSearchEventListenerRegister] Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled. 11:24:31 INFO [AnnotationBinder] Binding entity from annotated class: com.clinimed.model.Configuracao 11:24:31 INFO [EntityBinder] Bind entity com.clinimed.model.Configuracao on table CONFIGURACAO 11:24:31 INFO [AnnotationConfiguration] Hibernate Validator not found: ignoring 11:24:31 WARN [UserSuppliedConnectionProvider] No connection properties specified - the user must supply JDBC connections Exception in thread "main" org.hibernate.HibernateException: 'hibernate.dialect' must be set when no Connection available at org.hibernate.dialect.resolver.DialectFactory.buildDialect(DialectFactory.java:107) at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:142) at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2163) at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2159) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1383) at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954) at com.clinimed.util.HibernateUtil.getSession(HibernateUtil.java:14) at com.clinimed.teste.TestaConfiguracao.main(TestaConfiguracao.java:15)
Como devo proceder na implementação do Hibernate Utils ? Não quero ter que fazer um método específico para cada uma das classes do sistema.

Desde já agradeço.

vc tem 2 caminhos. ou vc mapeia todas as classes no seu hibernate-config ou então faz um

cfg.addAnnotatedClass(SuaClasse);

para cada classe do seu sistema.

Tenho por enquanto, 19 classes no meu sistema. Então vou ter que implementar o método getSession() 19 vezes ?

as 19 Classes precisão se conectar ao banco?

Essas são as classes de modelo da minha aplicação. Vou desenvolver os DAOs e eles que irão se conectar ao banco, claro que não ao mesmo tempo. Sendo assim preciso abrir uma sessão para cada uma dessas classes, e por isso tentei o getSession genérico que descrevi acima. Vc teria mais alguma sugestão ?

os bancos sao diferentes?

si for so tabelas diferentes mapeia todas no mesmo config.xml

talves ajude

http://javafree.uol.com.br/artigo/874250/HibernateUtils.html

[quote=robertoMoraes]os bancos sao diferentes?

si for so tabelas diferentes mapeia todas no mesmo config.xml

talves ajude

http://javafree.uol.com.br/artigo/874250/HibernateUtils.html
[/quote]

O banco é o mesmo, só as tabelas que mudam. Estou usando Annotations, quando vc diz para mapeá-las no config.xml, vc se refere a mapear apenas a classe em si, ou os seus atributos tb ?

Vou dar uma olhada no link que vc sugeriu.

Grato.

Bom se seu sistema so tiver um banco, e vc tiver varias configurações diferentes para o hibarnate.cfg, recomendo que modele a classe hiberante util, para receber o o parametro para criar um novo session , e customizei a minha dessa forma, lembrando que uso por meio de DAO

[code]//Esse metodo recebe um argumento do tipo String, mais exatamente o caminho do hibernateConfiguration
public static void setConfiguracao(String hibernateConfigura){
cfg = new Configuration().configure(hibernateConfigura);
}
//Esse metodo inicia o SessionFactory e devolve um objeto do tipo session
public static Session getSessao()
{
FabricaSessoes = cfg.buildSessionFactory();

    return FabricaSessoes.openSession();
}

[/code]
E o metodo que utilizo para mudar a configuração é este .

//Esse Metodo serve para refazer a configuração caso seja necessario public void Configuracao(String hibernateConfigura,Classe classe){ this.sessao.close(); HibernateUtil.setConfiguracao(hibernateConfigura); this.sessao = HibernateUtil.getSessao(); atualizaTranzacao(); this.classe = classe; }

mapear as classes no config.xml

e os atributos da classe(Pojo) nela mesmo usando annotations

Te aconselho a dar uma lida nos links abaixo:

[list]http://blog.caelum.com.br/jpa-com-hibernate-heranca-e-mapeamentos/[/list]
[list]http://blog.caelum.com.br/jpa-anotacoes-nos-getters-ou-atributos/[/list]
[list]http://blog.caelum.com.br/possibilidades-de-design-no-uso-do-seu-generic-dao/[/list]
[list]http://blog.caelum.com.br/ei-como-e-o-seu-dao-ele-e-tao-abstraido-quanto-o-meu/[/list]

Existem N formas de se fazer … o ideal é que avaliando o quadro de sua necessidade, você avalie qual a implementação te atende.

Eu normalmente tenho uma implementação genérica do pattern DAO e para cada tabela crio um pojo mapeando as colunas com os atributos usando annotations.

O getSession() que você comentou que iria ter que chamar toda vez que criar um Dao pode ficar no seu GenericDao que será extendido pelos demais Daos … ou seja, o acesso a conexão, commit e rollback é abstraído de quem esta acessando os métodos do Dao … fica tudo no GenericDao.

[]'s

[quote=marciobarroso]Te aconselho a dar uma lida nos links abaixo:

[list]http://blog.caelum.com.br/jpa-com-hibernate-heranca-e-mapeamentos/[/list]
[list]http://blog.caelum.com.br/jpa-anotacoes-nos-getters-ou-atributos/[/list]
[list]http://blog.caelum.com.br/possibilidades-de-design-no-uso-do-seu-generic-dao/[/list]
[list]http://blog.caelum.com.br/ei-como-e-o-seu-dao-ele-e-tao-abstraido-quanto-o-meu/[/list]

Existem N formas de se fazer … o ideal é que avaliando o quadro de sua necessidade, você avalie qual a implementação te atende.

Eu normalmente tenho uma implementação genérica do pattern DAO e para cada tabela crio um pojo mapeando as colunas com os atributos usando annotations.

O getSession() que você comentou que iria ter que chamar toda vez que criar um Dao pode ficar no seu GenericDao que será extendido pelos demais Daos … ou seja, o acesso a conexão, commit e rollback é abstraído de quem esta acessando os métodos do Dao … fica tudo no GenericDao.

[]'s[/quote]
Ótimos links cara. Obrigado.
Os pojos eu criei com Engenharia Reversa no Hibernate, porém os DAOs acho que vão me dar um pouco mais de trabalho
Teria como me passar esse seu GenericDAO para eu dar uma estudada ? Como ainda estou iniciando na plataforma Java, estou lendo bastante a respeito e ele seria de grande ajuda.

Obrigado mais uma vez.

[quote=hugo.hlcxcx]Pessoal estou precisando criar uma classe HibernateUtils genérica, de forma que eu consiga obter uma session para qualquer classe do meu sistema.

Estava estudando um exemplo que encontrei na apostila da Caelum, mas ele só funciona pra uma classe e não para todas como eu preciso. Seguem mais detalhes:
.
.
.
.

[/quote]

Cara vc fez a maior confusão !!!

Primeiro, continue na leitura da apostila pois os materiais da caelum semprem mostram a forma mais bruta e depois vão refinando os codigos. Mas só pra finalizar, não existe “HibernateUtils genérico” o que se precisa pra usar o hibernate é uma classe que cria apenas uma instancia do Sessionfactory para toda a aplicação e um metodo que retorne uma session pra quando precisar manipular algum objeto, essa classe ta pronta no pacote do próprio Hibernate e ela é explicada na apostila da Caelum.

Nesse caso eu tenho que manter a sessão aberta mesmo após incluir ou pesquisar algum registro no banco ?

Bom dia,

Essa é uma otima pergunta, posso estar errado mas os session sao objetos bem pequenos , na minha classe eu sempre abro o session e o fecho após salvar, ou atualizar, excluir etc…

Não.