buildSessionFactory() deprecated no Hibernate 4

8 respostas
G

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!

8 Respostas

S

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()…

G

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

S

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.

D

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.

G

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.

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…

D

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

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;
}

isso resolve ...

V

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:

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();

Pode me ajudar?

Muito Obrigado

A

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();
Criado 7 de janeiro de 2012
Ultima resposta 26 de jul. de 2012
Respostas 8
Participantes 6