Olá pessoal, tudo bem?
No artigo de hoje vamos trabalhar a parte da criação de uma Factory para obter Sessions do Hibernate. Veja na continuação.
Contexto
Para qualquer execução que você for realizar diretamente no Hibernate, você precisará de uma instância da interface org.hibernate.Session. Como mostra a linha 2 do exemplo abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public T findById(Long id) { Session session = HibernateUtil.getSession(); try { Query byIdQuery = session.createQuery("FROM " + this.entityClassName + " as c WHERE c.id = :id"); byIdQuery.setParameter("id", id); T object = (T) byIdQuery.uniqueResult(); this.inicializaLazyObjects(object); return object; } catch (Exception e) { throw new SeminariosCientificosException(e); } finally { session.close(); } } |
Mas como já disse no parágrafo anterior é uma interface! Não podemos dar um new e a vida segue.
Nesse caso iremos utilizar um conceito já apresentado aqui no site chamado Factory (Fábrica). Uma Factory nada mais é que uma produtora de instâncias de um determinado tipo, seja esse tipo uma interface, uma classe entre outros.
O ponto aqui é que o Hibernate já possui uma org.hibernate.SessionFactory. Assim não será necessário criar uma factory, mas sim aprender a utilizar desta. Então vamos criar uma classe HibernateUtil e utilizá-la como mostrou o exemplo anterior!
Criando a classe HibernateUtil
O primeiro ponto aqui é a criação da classe HibernateUtil, vamos criar dentro de um package util do projeto.
1 2 3 4 5 6 7 8 9 |
package br.com.mauda.seminario.cientificos.dao.util; /** * @author Mauda * */ public class HibernateUtil { } |
Obtendo a instância de SessionFactory
Como já mencionado anteriormente, vamos utilizar da interface org.hibernate.SessionFactory. Assim iremos criar um atributo desta interface na classe, mas essa instância deverá sempre ser a mesma perante toda a aplicação. Assim vamos utilizar a palavra reservada static para que ela esteja no contexto do loader da classe. E além disso, vamos utilizar boas praticas de encapsulamento e vamos deixar o atributo privado.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package br.com.mauda.seminario.cientificos.dao.util; import org.hibernate.SessionFactory; /** * @author Mauda * */ public class HibernateUtil { private static SessionFactory sessionFactory; } |
Atributo criado, agora precisamos inicializá-lo. Essa é uma atividade um pouco mais complexa que não se resume a apenas uma linha de código, então vamos utilizar um método para isso. Um nome bem sugestivo seria getSessionFactory(). Além disso, essa fábrica não deverá ser chamada por outros pontos do código. Assim vamos manter esse método privado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package br.com.mauda.seminario.cientificos.dao.util; import org.hibernate.SessionFactory; /** * @author Mauda * */ public class HibernateUtil { private static SessionFactory sessionFactory; private static SessionFactory getSessionFactory() { } } |
Agora vamos obter essa instância! Para tanto precisamos de uma instância da classe org.hibernate.cfg.Configuration e depois de criada essa instância vamos chamar um método para realizar a configuração dessa classe. Essa classe Configuration é responsável por achar o arquivo hibernate.cfg.xml e obter as suas informações.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package br.com.mauda.seminario.cientificos.dao.util; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * @author Mauda * */ public class HibernateUtil { private static SessionFactory sessionFactory; private static SessionFactory getSessionFactory() { Configuration configuration = new Configuration(); configuration.configure(); } public static Session getSession() { return getSessionFactory().openSession(); } } |
Feito essa configuração, precisamos criar uma instância de org.hibernate.service.ServiceRegistry, que conterá todas as propriedades da instância de Configuration. Para criar essa instância, precisaremos de um Builder chamado org.hibernate.service.ServiceRegistryBuilder. Com esse builder é possível configurar as propriedades que estão dentro da instância de configuration.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package br.com.mauda.seminario.cientificos.dao.util; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; /** * @author Mauda * */ public class HibernateUtil { private static SessionFactory sessionFactory; private static SessionFactory getSessionFactory() { Configuration configuration = new Configuration(); configuration.configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()).buildServiceRegistry(); } } |
E por fim, com essa instância de serviceRegistry, agora é possivel configurar a sessionFactory e retorná-la para o atributo criado anteriormente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package br.com.mauda.seminario.cientificos.dao.util; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; /** * @author Mauda * */ public class HibernateUtil { private static SessionFactory sessionFactory = getSessionFactory(); private static SessionFactory getSessionFactory() { Configuration configuration = new Configuration(); configuration.configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()).buildServiceRegistry(); return configuration.buildSessionFactory(serviceRegistry); } } |
Obtendo a instância de Session
Com a instância de SessionFactory criada, agora pode ser obtida a instancia de org.hibernate.Session. Olhando no exemplo inicial vemos que é chamado um método getSession() da instância de HibernateUtil.
1 |
Session session = HibernateUtil.getSession(); |
Assim vamos criar esse método dentro da HibernateUtil.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package br.com.mauda.seminario.cientificos.dao.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; /** * @author Mauda * */ public class HibernateUtil { private static SessionFactory sessionFactory = getSessionFactory(); private static SessionFactory getSessionFactory() { Configuration configuration = new Configuration(); configuration.configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()).buildServiceRegistry(); return configuration.buildSessionFactory(serviceRegistry); } public static Session getSession() { } } |
Para obter a session, vamos adicionar uma linha dentro do método getSession(), onde utilizaremos a instancia de sessionFactory para chamar o método openSession().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package br.com.mauda.seminario.cientificos.dao.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; /** * @author Mauda * */ public class HibernateUtil { private static SessionFactory sessionFactory = getSessionFactory(); private static SessionFactory getSessionFactory() { Configuration configuration = new Configuration(); configuration.configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()).buildServiceRegistry(); return configuration.buildSessionFactory(serviceRegistry); } public static Session getSession() { return sessionFactory.openSession(); } } |
Pronto! Agora a classe HibernateUtil, pode ser utilizada dentro do projeto para obter instâncias de Session.
finally{
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply