Pessoal,
Estou começando com hibernate e gostaria de saber se a melhor maneira de criar uma classe utilitaria para o hibernate seria assim com ThreadLocal e etc. uma outra coisa é se temos que fechar a “session” ou não. quando utilizamos!!
Gostaria a opinião de todos!
P.S.: Esse codigo foi retirado do codigo fonte do Guj.
public class HibernateSessionFactory
{
protected class LocalSessionManager extends ThreadLocal {
protected Object initialValue() {
Session session;
try {
session = HibernateSessionFactory.this.sessionFactory.openSession();
}
catch (HibernateException e) {
throw new RuntimeException("Problems while opening a new thread local hibernate session", e);
}
return session;
}
}
private static HibernateSessionFactory instance;
/***
* Acesso ao singleton.
*
* @return o singleton desta classe
*/
public static HibernateSessionFactory getFactory() {
if (instance == null) {
try {
instance = new HibernateSessionFactory();
}
catch (Exception e) {
throw new RuntimeException("problems while instantiating the singleton", e);
}
}
return instance;
}
private SessionFactory sessionFactory;
private LocalSessionManager sessionManager = new LocalSessionManager();
/***
* Construtor privado para o singleton
*
* @throws IOException
* @throws HibernateException
*/
private HibernateSessionFactory() throws HibernateException {
Configuration cfg = new Configuration();
cfg.addClass(Cliente.class);
cfg.addClass(Pedido.class);
this.sessionFactory = cfg.buildSessionFactory();
}
/***
* Pega uma sessão do Hibernate.
* Talvez essa sessão seja aberta agora, caso a Thread.currentThread() nunca tenha
* pedido uma sessão ainda.
*
* @return uma sessão do hibernate.
*/
public Session getSession() {
Session session = (Session) this.sessionManager.get();
return session;
}
public Session getNewSession() {
Session session;
try {
session = this.sessionFactory.openSession();
}
catch (HibernateException e) {
throw new RuntimeException("Problems while opening a new hibernate session", e);
}
return session;
}