Ir para o conteúdo

 Voltar a Banco de Tal...
Tela cheia

Jboss, local-tx-datasource, no-tx-datasource e autocommit

11 de Julho de 2012, 13:01 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 63 vezes

Estou com o seguinte problema no Banco de Talentos: dentro da classe CurriculoFacade no método obterValoracoesPorTalento ocorre um loop que retorna objetos do tipo AtributoTalentoValorado

        while (itrAtributosTalentoValorados.hasNext())
            {
               //Varre todos os AtributoTalentoValorado, ou seja os valores preenchidos, para fazer as inicializacoes necessarias (lazy)
                AtributoTalentoValorado objAtributoTalentoValorado = (AtributoTalentoValorado) itrAtributosTalentoValorados.next();

Em algum momento dentro desse while eu executo o seguinte código:

           objAtributoTalentoValorado.setValoracao("alguma coisa");
            

e isso está fazendo atualizar o valor no banco de dados.

Quando rodo a aplicação no Tomcat não dá problema, pois o default do hibernate.connection.autocommit  é false.

Porém, quando roda no JBoss usando local-tx-datasource ocorre a atualização. Já tentei mudar para no-tx-datasource mas também não funcionou.

Qual o procedimento mais adequado para fazer nesse caso?

 

Abs,

Christian





Autor: Christian Cleber Masdeval Braz


44 comentários

  • F24dd96a3b3343b99b684fc44d2e5b71?only path=false&size=50&d=404Luciano Dias(usuário não autenticado)
    12 de Julho de 2012, 10:35

     

    Oi Christian,

    Infelizmente eu ainda não tenho experiência com o JBoss.

    Uma opção seja criar uma propriedade dessa classe que não é persistida. Assim, você pode setá-la sem persistir e, na hora de mostrar, se essa propriedade estiver preenchida, você a exibe no lugar da "Valoracao".

    Não é uma solução, mas um possível contorno para esse problema.

    Um abraço,

    Luciano.

    • 5027e96c2c456119c052b9d4a37310c8?only path=false&size=50&d=404Christian Cleber Masdeval Braz(usuário não autenticado)
      12 de Julho de 2012, 13:33

       

      Valeu Luciano. 

       

      Obrigado

    • 5027e96c2c456119c052b9d4a37310c8?only path=false&size=50&d=404Christian Cleber Masdeval Braz(usuário não autenticado)
      12 de Julho de 2012, 14:28

       

      Luciano, mais uma coisa. O estranho é que não existe uma chamada ao DAO para fazer a atualização. Não existe portanto a chamada ao código

      hbsSession.update(objPOJO);

       

      Por que será então ocorre a atualização no banco de dados apenas com a execução do set?

      • F24dd96a3b3343b99b684fc44d2e5b71?only path=false&size=50&d=404Luciano Dias(usuário não autenticado)
        13 de Julho de 2012, 14:30

         

        Oi Chistian,

        Acredito que o objeto que acabou de ser recuperado está ligado ao banco de dados e, por isso, ocorre a atualização no banco de dados ao executar o set. Os métodos do DAO devem ser chamados obrigatoriamente quando desejamos persistir o estado de um objeto desconectado.

        Veja o que achei:

        "Whenever you pass an object to save(), update() or saveOrUpdate(), and whenever you retrieve an object using load(), get(), list(), iterate() or scroll(), that object is added to the internal cache of the Session.

        When flush() is subsequently called, the state of that object will be synchronized with the database. If you do not want this synchronization to occur, or if you are processing a huge number of objects and need to manage memory efficiently, the evict() method can be used to remove the object and its collections from the first-level cache."

        Ou seja, se você não quer persistir as alterações feitas num objeto que foi recuperado do banco de dados, você pode tentar utilizar o evict() para que nenhuma sincronização (atualização) seja feita naquele momento.

        Outra coisa, você teria como me orientar em como reproduzir o problema ? Assim poderei criar um caso de teste para essa situação.

        Um abraço,

        Luciano.

Essa comunidade não possui posts nesse blog