buildSessionFactory() deprecated no Hibernate 4

Como quem baixou e usou o Hibernate 4 viu, o método buildSessionFactory() esta marcado como deprecated nesta nova versão…

Com a introdução do ServiceRegistry o framework mudou a forma de como ele vai criar e gerenciar as sessões. Agora usa-se buildSessionFactory(ServiceRegistry service)

Para dar uma luz pra galera que ta meio perdida ainda de o que usar no lugar do buildSessionFactory() (que vai ser removida na versão 5 do HiB) fiz um pequeno tutorial colocando um HibernateUtils de exemplo para dar um início na sua pesquisa…

http://arthurgregorio.eti.br/blog/79-programacao/java/96-buildsessionfactory-hibernate-4

Se alguém aqui já estiver utilizando uma solução mais madura do que essa que estou propondo e quiser compartilhar!

Se houver alguma melhora nesse código vou atualizar o post… (Y)

falow galera!

Uma coisa que eu achei meio estranha foi que na documentação oficial da versão 4 ainda estão utilizando o método buildSessionFactory()…

Pois é… ta um “Coming soon…” lá onde deveriam estar explicando onde usar… eahaeuhhauuhea complicado mudarem algo mas “não mostrarem” como fazer pra usar…

Link: http://docs.jboss.org/hibernate/core/4.0/devguide/en-US/html_single/#services-registry-sessionfactory

Então… bem escondido isso aí. Eu já mexia com a 3, mas resolvi dar uma olhada começando pelo “Getting Started Guide”, pra dar uma olhada na documentação, e lá eles ainda tão usando o método deprecated. Pra quem tá começando isso é meio tenso… é como se falassem “olha, vai quebrando o galho com isso que depois eu ajeito”. Mas enfim, vamos esperar, afinal a versão 4 acabou de sair.

Olá, camarada.
Boa iniciativa.
Há algum tempo notei a mesma coisa. Como ministro cursos de hibernate, precisava me atualizar.
Porém, a dificuldade era esta, não poderia iniciar algo, sem a documentação oficial estar 100%.
De qualquer maneira, teu exemplo é bem interessante, funcional (mesmo com Oracle XE).

Parabéns pela iniciativa, vamos aguardar o que o pessoal da JBoss Comunity trará. Espero que não demore.

[quote=drsmachado]Olá, camarada.
Boa iniciativa.
Há algum tempo notei a mesma coisa. Como ministro cursos de hibernate, precisava me atualizar.
Porém, a dificuldade era esta, não poderia iniciar algo, sem a documentação oficial estar 100%.
De qualquer maneira, teu exemplo é bem interessante, funcional (mesmo com Oracle XE).

Parabéns pela iniciativa, vamos aguardar o que o pessoal da JBoss Comunity trará. Espero que não demore.[/quote]

Valew cara!

pois eh! a galera da JB me parece estar meio largada… não é primeira vez que vejo um novo release do Hibernate sair e não ter documentação para algumas das novas funcionalidades…

retirado de http://stackoverflow.com/questions/8621906/is-buildsessionfactory-deprecated-in-hibernate-4

[code]private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;

private static SessionFactory configureSessionFactory() throws HibernateException {
Configuration configuration = new Configuration();
configuration.configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
}[/code]

isso resolve …

gregorioarthur tentei seguir seu tutorial, pore´m estou tendo o sequinte erro:

Exception in thread "main" org.hibernate.metamodel.source.MappingException: Unable to create stax reader at org.hibernate.service.internal.JaxbProcessor.unmarshal(JaxbProcessor.java:80) at org.hibernate.service.ServiceRegistryBuilder.configure(ServiceRegistryBuilder.java:162) at org.hibernate.service.ServiceRegistryBuilder.configure(ServiceRegistryBuilder.java:147) at br.com.fj28.test.AdicaoDeProduto.main(AdicaoDeProduto.java:27) Caused by: javax.xml.stream.XMLStreamException: java.net.MalformedURLException at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.<init>(Unknown Source) at com.sun.xml.internal.stream.XMLInputFactoryImpl.getXMLStreamReaderImpl(Unknown Source) at com.sun.xml.internal.stream.XMLInputFactoryImpl.createXMLStreamReader(Unknown Source) at org.hibernate.service.internal.JaxbProcessor.unmarshal(JaxbProcessor.java:67) ... 3 more Caused by: java.net.MalformedURLException at java.net.URL.<init>(Unknown Source) at java.net.URL.<init>(Unknown Source) at java.net.URL.<init>(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDocumentEntity(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.setInputSource(Unknown Source) ... 8 more Caused by: java.lang.NullPointerException ... 15 more

O meu código porenquanto esta assim:

[code]Configuration cfg = new Configuration();
cfg.setProperty(“hibernate.connection.driver_class”, “com.mysql.jdbc.Driver”);
cfg.setProperty(“hibernate.connection.url”, “jdbc:mysql://127.0.0.1:3306/my_db”);
cfg.setProperty(“hibernate.connection.username”, “username”);
cfg.setProperty(“hibernate.connection.password”, “passw”);
cfg.setProperty(“hibernate.show_sql”, “true”);
cfg.setProperty(“hibernate.dialect”, “org.hibernate.dialect.MySQL5InnoDBDialect”);
cfg.setProperty(“hibernate.connection.autocommit”, “false”);
cfg.setProperty(“hibernate.c3p0.min_size”, “5”);
cfg.setProperty(“hibernate.c3p0.max_size”, “20”);
cfg.setProperty(“hibernate.c3p0.timeout”, “1800”);
cfg.setProperty(“hibernate.c3p0.max_statements”, “50”);
cfg.setProperty(“hibernate.hbm2ddl.auto”, “update”);
cfg.setProperty(“hibernate.cache.provider_class”, “org.hibernate.cache.NoCacheProvider”);
cfg.setProperty(“hibernate.transaction.factory_class”, “org.hibernate.transaction.JDBCTransactionFactory”);
cfg.setProperty(“hibernate.current_session_context_class”, “thread”);
cfg.setProperty(“hibernate.generate_statistics”, “true”);

	ServiceRegistryBuilder builder = new ServiceRegistryBuilder();
	builder.applySettings(cfg.getProperties());
	
	ServiceRegistry serviceRegistry = builder.configure().buildServiceRegistry();
	MetadataSources metadataSources = new MetadataSources(serviceRegistry);
	metadataSources.addAnnotatedClass(Produto.class);
	
	SessionFactory sessionFactory = metadataSources.buildMetadata().buildSessionFactory();[/code]

Pode me ajudar?

Muito Obrigado

A chamada builder.configure() espera que em seu projeto tenha um hibernate.cfg.xml.

Crie um configuration e informe as properties de configuração do hibernate, build o service registry sem chamar o configure.

		Configuration cfg = new Configuration();
		cfg.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
		(...)

		ServiceRegistryBuilder builder = new ServiceRegistryBuilder();
		builder.applySettings(cfg.getProperties());

		ServiceRegistry serviceRegistry = builder.buildServiceRegistry();