Onde fechar a sessao hibernate numa app web?

0 respostas
J
Pessoal, Tenho tido problemas com o seguinte: quando a app inicializa, o seguinte bean que contém uma lista de objetos SalaDeReuniao é recuperado do banco, com o seguinte código:
public List getSalas()
   {
       String consulta = "select s from SalaDeReunioes as s";
        
        Session sess = HibernateUtil.getSessao();
        
        //busca das salas no bd
        Transaction t = sess.beginTransaction();
        Query q = sess.createQuery(consulta);
        List salas = q.list();        
        t.commit();        
      
        //HibernateUtil.fechaSessao();
        
        return salas;
   }
Notem que HibernateUtil.fechaSessao(); está comentado porque ele diz que não pode fazer lazy load da lista de salas... Ai eu tenho o seguinte código para atualizar uma das salas da lista:
public boolean atualiza(SalaDeReunioes sala)
    {
        Session sessao = HibernateUtil.getSessao();
        Transaction t = sessao.beginTransaction();
        sessao.update(sala);
        t.commit();
        HibernateUtil.fechaSessao();
        return true;
    }
Mas dá o seguinte erro:
org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
O HibernateUtil é adaptado do próprio manual do hibernate:
public class HibernateUtil {

    private static Log log = LogFactory.getLog(br.uesc.apblopes.cooperedit.hibernateutil.HibernateUtil.class);

    private static final SessionFactory sessionFactory;

    static {
        try {
            // Create the SessionFactory
            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            log.error("Não foi possível configurar o hibernate.", ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static final ThreadLocal session = new ThreadLocal();

    public static Session getSessao() {
        Session s = (Session) session.get();
        // Open a new Session, if this Thread has none yet
        if (s == null) {
            s = sessionFactory.openSession();
            session.set(s);
        }
        return s;
    }

    public static void fechaSessao() {
        Session s = (Session) session.get();
        if (s != null)
            s.close();
        session.set(null);
    }
}
E eu continuo sem saber onde fechar as sessoes hibernate.... Agradeço a ajuda de vcs.
Criado 3 de maio de 2005
Respostas 0
Participantes 1