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]
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.
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 ?
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 ?
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;
}
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.
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.
[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.
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…