- Quando as Threads estavão sendo executas acontecia exceções na session do Hibernate. Tudo isso porque eu tinha implementado "ThreadLocal
" na minha Factory o que esta certo, e então quando as Threads entravam em processamento a Session não estava vinculada a mesma, porque a Thread foi instanciada e Startada por um processo do WebServer. - Como Solucionar. Eu criei uma factory para ser utiliza unicamente pelas Threads que executão os processos em batch:
- Ficou assim HibernateFactoryThread que extends HibernateFactory: eu subescrevi quase tudo, exceto a SessionFactory que já esta instanciada na classe que esta sendo extendida.
- public class HibernateThreadFactory extends HibernateFactory {
private static Logger log = Logger.getLogger(HibernateFactory.class);
private static ThreadLocalsessions = new ThreadLocal ();
public static Session abreSessao(){
if (sessions.get() != null){
log.error("Essa Sessao nao foi fechada");
}
Session s = getFactory().openSession(); //O metodo em vermelho é da Factory extendida.
sessions.set(s);
return s;
}
public static Session buscaSessaoCorrente(){
if(sessions.get()!= null && sessions.get().isOpen()){
return sessions.get();
}
return abreSessao();
}
public static void fechaSessao(){
if(sessions.get().isOpen()){
sessions.get().close();
}
}
} - Pronto agora é só utilizar nos metodos das Threads a HibernateThreadFactory.
Espero ter Ajudado, bom aproveito.