[RESOLVIDO]beginTransaction()

Olá, pessoal.
Sou um grande leitor do GUJ. Encontro quase tudo que preciso aqui, mas estou com um problema que não achei nada parecido na Internet, ou se achei não entendi. Preciso de ajuda, por isto eu finalmente me cadastrei. :slight_smile:

Dados:
Hibernate 3
JDBC - mysql-connector… 5.1.7
POOL - c3p0

Minha persistencia:

class DAO(){

public void Insert(Object objeto) throws Exception{
        try {
            Session s = HB.getSession();
            Transaction t = s.beginTransaction();
            s.save(objeto);
            t.commit();
            s.flush();
            s.close();
            LOG.LOG("DAO", "EVENTO", "Cadastrou novo " + objeto.getClass().getSimpleName().toString());
        } catch (Exception ex) {
            LOG.LOG("DAO", "ERRO", "Cadastrar novo " + objeto.getClass().getSimpleName().toString()+". Detalhes do erro: "+ex.toString());
        }
    }

    public void Update(Object objeto) {
        try {
            Session s = HB.getSession();
            Transaction t = s.beginTransaction();
            s.update(objeto);
            t.commit();
            s.flush();
            s.close();
            LOG.LOG("DAO", "EVENTO", "Atualizou um " + objeto.getClass().getSimpleName().toString());
        } catch (Exception ex) {
            LOG.LOG("DAO", "ERRO", "Atualizar um " + objeto.getClass().getSimpleName().toString()+". Detalhes do erro: "+ex.toString());
        }
    }

    public void Deleta(Object objeto) {
        try {
            Session s = HB.getSession();
            Transaction t = s.beginTransaction();
            s.delete(objeto);
            t.commit();
            s.flush();
            s.close();
            LOG.LOG("DAO", "EVENTO", "Deletou um " + objeto.getClass().getSimpleName().toString());
        } catch (Exception ex) {
            LOG.LOG("DAO", "ERRO", "Deletar um " + objeto.getClass().getSimpleName().toString()+". Detalhes do erro: "+ex.toString());
        }
    }

    public List getO(String hql) {
        List obj = new ArrayList();
        Session s = HB.getSession();
        Transaction t = s.beginTransaction();
        Query q = s.createQuery(hql);
        obj = q.list();
        t.commit();
        s.flush();
        s.close();
        return obj;
    }

}

Bom, meu projeto está bem grande agora, e tudo funcionava perfeitamente, entretanto, depois que fiz uma classe para controle de POSTs (uma servlet recebe o request e manda para esta minha classe, ela trabalha o request, grava as informações necessárias e redireciona para uma outra página. Bem… Tudo está funcionando até aqui, mas depois deste processo ser executado, o hibernate não inicia mais uma transação.

Depurando, percebi que quando chega na linha “Transaction t = s.beginTransaction();”, ele para. Simplesmente para, posso esperar o quanto for, ele não sai dali.

Como não tenho muita experiência com Hibernate, não sei o que pode estar acontecendo.

É importante ressaltar que esta classe citada acima, funciona em todo meu projeto. Eu construo o projeto, rodo, funciona tudo certinho. Basta eu usar a classe que eu mencionei que executa algumas ações com o request (chamado pela Servlet) e pronto, ele termina a ação (um inserção no banco) depois nada mais acontece.

Agradeceria qualquer ajuda do que possa ser, vou continuar procurando a solução na Internet.

Att,

McLuck

Veja: https://www.hibernate.org/43.html

Boa Noite, Rafael. Agradeço sua resposta.

Eu já li esta parte da comunicação do Hibernate, mas não achei parecido com meu problema não. Minhas listas e relacionamentos estão funcionando certinhos. EU montei os lazys de acordo com a usabilidade mesmo.
Meu problema é outro.

Seguinte, vejam este trcho de código:

public void Insert(Object objeto) throws Exception{
        try {
            Session s = HB.getSession();
            Transaction t = s.beginTransaction();
            s.save(objeto);
            t.commit();
            s.flush();
            s.close();
            LOG.LOG("DAO", "EVENTO", "Cadastrou novo " + objeto.getClass().getSimpleName().toString());
        } catch (Exception ex) {
            LOG.LOG("DAO", "ERRO", "Cadastrar novo " + objeto.getClass().getSimpleName().toString()+". Detalhes do erro: "+ex.toString());
        }
    }

é uma inserção bem simples. Ele insere um objeto. Certo, finalizou transação e fechou sesão…

Curiosidade: Ele ainda faz o LOG perfeitamente, notem que como eu usei String (“DAO” e “EVENTO”), minha Classe LOG ainda vai ter que buscar a id de cada opção ainda. Como eu disse, ele grava o LOG, então acho que é a última coisa que faz no banco de dados.

Depois disto, torna-se impossível fazer qualquer coisa. Não importa o que eu peça, a página que eu abra, não importa. Toda solicitação, para na seguinte linha:

O interessante também é que se eu coloco os parametros pro Hibernate para ver o que ele está fazendo:

         <property name="show_sql">true</property>
        <property name="hibernate.generate_statistics">true</property>
        <property name="hibernate.use_sql_comments">true</property>

As ultimas coisas que vejo no console é aproximadamente umas 70 linhas de “selects” e de “loads”(de listas)…
Isto indica que, embora ele pare na linha mencionada acima (beginTransaction()), ele chega a executar e carregar as coisas na memória.

Mas dai para, nada mais acontece. Nenhum erro no console, nada em meu LOG (também, pudera, ele usa o banco :P)…

Bom…

Como tudo funcionava perfeitamente, pensei que fosse esta nova classe que criei, por que o objeto em questão tem uma lista de coisas deste outra classe, então fui rever, passei um pente fino, refiz algumas coisas, mas nada.
Estou lendo quase toda a documentação do Hibernate, mas não encontro o que preciso.

Pelo menos que desse algum erro, seria mais fácil.

Agradeço a atenção.

Att,

McLuck

Agradeço.

Descobri um leak. :smiley: (um laço carregado objetos na memória. Thread)…
Falha minha. Por isto não iniciava mais transações, mas o incrível é que ele deveria dar alguma mensagem, algum erro. Sei lá…
Mas apenas parava… Isto é estranho pra mim.

Bom, vantagem é que agora minha aplicação ta com um desempenho bem melhor. Acho que já tava com este problema há tempos e só descobri agora :frowning:

Aguém saberia esclarecer o que poderia ter acontecido? Para ele não dar nenhuma mensagem de erro, apenas congelar? (Detalhe, se eu reiniciavao servidor, ele voltava a funcionar.)

Ainda não entendi direito o que aconteceu não, mas sei que o problema parou de acontecer :stuck_out_tongue:

Agradeço a atenção. Agradeço prestatividade do Rafael…

PS - Vou colocar como RESOLVIDO no título, mas se alguém tiver alguma idéia do que posso ter falhado aqui, agradeceria opiniões…

Att,

McLuck