Pessoal qual a melhor maneira de criar uma classe utilitaria para o uso do hibernate. vcs usam ThreadLocal?
uma outra coisa quando se usa ThreadLocal não precisa fechar a session?
valeu
Pessoal qual a melhor maneira de criar uma classe utilitaria para o uso do hibernate. vcs usam ThreadLocal?
uma outra coisa quando se usa ThreadLocal não precisa fechar a session?
valeu
O jeito mais comum é usando ThreadLocal sim … mas serve (i.e: mais bunitinho) via um container IOC qualquer gerenciando isso pra você
Só não entendi qual a relação do ThreadLocal com o fechar ou não a sessão do Hibernate. Precisa fechar sim
Pois no hibernate in action fala que quando usar a estrategia ThreadLocal não é recomendado fechar a session.
Isso está correto?
Poderia disponibilizar um exemplo de como vcs utilizam ThreadLocal?
SessionFactory != Session
Sessions devem ser fechadas assim que possível.
SessionFactories devem ser fechadas o mais tarde possível. Preferencialmente, nunca :thumbup:
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;
}
Esse codigo está certo? e como utilizaria na pratica?
valeu pessoal pelas respostas