Ir para o conteúdo

 Voltar a Banco de Tal...
Tela cheia

Problema no método fecharSessao da classe FabricaSessaoHibernate

10 de Novembro de 2009, 18:03 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 2 vezes
try
   {
       // "Gato" para resolver o problema do Ingres que abre uma transação automaticamente...
        ConexaoJDBC conexao = new ConexaoJDBC(hseHibernateSession);
        conexao.realizarTransacao();
        conexao.fechar();
   }
   catch (Exception e)
   {
     // Paciência...
   }

O problema que ocorre é que quando faço a consulta pelos talentos de um usuário, num determinado

momento preciso alterar temporariamente o valor de um objeto AtributoTalentoValorado dentro do metodo obterValoracoesPorTalento.

No final desse método existe um DAO.desconectar que chama o fecharSessao. Acontece que quando chega no código acima

ele faz um commit no banco de tudo que está pendente, inclusive o objeto que foi modificado.

Qual exatamente será o problema que terei se deixar esse código comentado?

 

Autor: Christian Cleber Masdeval Braz


1Um comentário

  • F24dd96a3b3343b99b684fc44d2e5b71?only path=false&size=50&d=404Luciano Dias(usuário não autenticado)
    13 de Novembro de 2009, 20:52

     

    Oi Christian,

    Você pode comentar esse trecho sem maiores problemas (ainda mais se não estiver utilizando o banco de dados Ingres - versão antiga - com uma configuração semelhante à nossa).

    Explicação: nosso banco de dados Ingres está configurado para automaticamente sempre abrir uma transação. Como não conseguíamos executar transações no banco sem explicitamente executar um COMMIT, achamos essa solução que resolveu nosso problema simulando um AUTOCOMMIT.

    Nós utilizamos também o banco de dados Oracle e o SQL Server com nossas aplicações Java em produção com esse mesmo mecanismo e nunca tivemos problemas. Pois todas as verificações e tarefas são executadas antes de chegar nesse código (ver detalhamento abaixo).

    Em qual contexto você está precisando desses objetos alterados temporariamente e quando é que você pretende persistir essa alteração ? Obs: por opção nossa, não deixamos nenhuma conexão hibernate aberta na camada de visão.

    Detalhamento do método fecharSessao(String):

    1) Verifica se existe uma sessão hibernate aberta para a conexão informada;

    2) Se não existe ou se quem está pedindo para a fechar a sessão não é quem pediu para iniciar (mesmo método de uma classe *Facade.Java), ignorar solicitação e sair do método;

    3) Se existe transação aberta (não deveria, pois o método da classe *Facade.Java tem que realizar - commit - ou desfazer - rollback - toda e qualquer transação que ele iniciou antes de pedir para fechar a conexão), então é executado um rollback pois não foi solicitado explicitamente para executar um commit;

    4) Executa um flush na sessão hibernate e simula um AUTOCOMMIT (gato para o Ingres);

    5) Outras execuções que não são de interesse no momento.

    Um abraço,

    Luciano.

Essa comunidade não possui posts nesse blog