Olá pessoal bom dia.
Estou tentando fechar a session do meu método salvar(), mas estou tendo um problema.
O método está assim:
public String salva() {
System.out.println("Adicionando: " + funcionario.getNome());
Session session = HibernateUtil.openSession();
try {
//...
//...
} finally {
if (session != null) {
try {
System.out.println("finalizando a session");
session = HibernateUtil.currentSession(); //pego a session atual;
session.clear(); //limpo
session.close(); //depois fecho
Session session2 = HibernateUtil.openSession(); //abro uma nova session
funcionario = new Funcionario();
} catch (HibernateException e) {
System.err.println("Hibernate Exception" + e.getMessage());
throw new RuntimeException(e);
}
}
Quando eu dou o openSession, o hibernate me diz que tem uma sessão aberta (session.get != null), e não grava o registro. Se eu retiro o openSession, ele me dá uma exception dizendo que a session já foi fechada…
Eae pessoal, alguma dica??
Obrigado.
Esqueci de postar:
No meu HibernateUtil , o método openSession está assim:
public static Session openSession() {
if (sessions.get() != null) {
logger.error("Alguem nao fechou uma j� aberta!!");
// grave, alguem nao fechou uma j� aberta!
}
sessions.set(sessionFactory.openSession());
return sessions.get();
}
Vlw.
Posta seu código ineteiro de HuibernateUtils.
Outra vc tem a instancia na sua varivel de instancia session, não precisa ir no HibernateUtils, para pegar novamente na finalização.
[quote=yoshikichi]Posta seu código ineteiro de HuibernateUtils.
Outra vc tem a instancia na sua varivel de instancia session, não precisa ir no HibernateUtils, para pegar novamente na finalização.[/quote]
Olá yoshikichi,
Segue o codigo:
[code]package br.gov.rr.setrabes.util;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
//import org.postgresql.core.Logger;
public class HibernateUtil {
private static Logger logger = Logger.getLogger(HibernateUtil.class);
private static SessionFactory sessionFactory;
// ajuda a guardar as coisas na thread
private static ThreadLocal<Session> sessions = new ThreadLocal<Session>();
static {
sessionFactory = new AnnotationConfiguration().configure()
.buildSessionFactory();
}
public static Session openSession() {
if (sessions.get() != null) {
logger.error("Alguem nao fechou uma j� aberta!!");
// sessions.get().close(); //PENSEI EM FECHAR CASO A SESSION AINDA ESTIVESSE ABERTA, MAS NÃO ADIANTOU...
// sessions.set(null);
// grave, alguem nao fechou uma j� aberta!
}
sessions.set(sessionFactory.openSession());
return sessions.get();
}
public static Session currentSession() {
return sessions.get();
}
public static void closeCurrentSession() {
sessions.get().close();
sessions.set(null);
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
[/code]
Tenta comentar a linha:
session = HibernateUtil.currentSession(); //pego a session atual;
pq e fecha a isntancia que está na varivel de isntancia
session.
[quote=yoshikichi]Tenta comentar a linha:
session = HibernateUtil.currentSession(); //pego a session atual;
pq e fecha a isntancia que está na varivel de isntancia
session.[/quote]
Já tinha tentado, mesmo assim não resolve…
QUanto ao grupo, vou entrar lá.
Obrigado.