Fórum Aplicação Web JSF #8929

28/08/2009

0

Olá, eu estou com o seguinte problema:

Quando eu faço um teste dos DAO's Hibernate dentro de uma classe com o método main, todos os métodos são executados sem nenhum problema, métodos, save, delete, get e update, mas quando eu faço isso em web usando JSF e Tomcat como conteiner, os métodos delete, update e get funcionam sem problemas, agora o método save executa também normalmente, sem apresentar erros, no console ele mostra o insert, tanto que quando eu tento incluir novamente os mesmos, o sistema acusa que já está gravado no banco de dados, até aí está dentro do esperado, mas o problema é que se eu for no BD e consultar os registros manualmente ele não se encontra lá, e outra esse teste de duplicidade que o sistema acusa quando eu tento gravar os mesmo regristros, funciona enquanto o tomcat está startado, se reiniciar o tomcat e tentar gravar os mesmos registros novamente ele inclui, mas como falei anteriormente se for consultar manualmente no BD, ele não está lá.
Não sei se expliquei bem ou enrolei demais, mas é como se o registro ficassem em memória RAM e quando desligado o PC, no caso o Tomcat, e voltasse a ligar o PC, Tomcat, a memória estaria limpa.
Não sei se compliquei, se não entender o que expus retorne-me.

Obrigado.

Aleandro
Aleandro Dalan

Aleandro Dalan

Responder

Posts

30/08/2009

Henrique Weissmann

Olá Aleandro, bom: vamos lá, eis a possível razão pela qual o seu problema está acontecendo: Gerenciamento de transações: você está finalizando as suas transaçõees? No Hibernate, ao trabalhar com o objeto Session, você está chamando o método commit após a persistência dos dados? Se não estiver, os seus dados encontrarão-se isolados dentro da sua transação, razão pela qual no banco de dados os mesmos não irão aparecer. Como o método é finalizado e você não fechou a transação, esta ficará perdida, e será excluida do banco de dados após algum tempo (já que não foi finalizada). Os dados só serão visíveis, neste caso, dentro do código que o executa, o que talvez explique o seu problema.
Responder

Gostei + 0

31/08/2009

Aleandro Dalan

Olá, eu estou chamando o método commit(), mas não está persistindo no banco, abaixo está o código:

public String salvar() {
        if (!session.isOpen()) {
            session = HibernateUtil.getSessionFactory().openSession();
        }
        
        try {
            session.beginTransaction();
            if (dao.isExist(uf).equals(true)) {
                mensagem = "Já está cadastrado";
            } else {
                dao.save(uf);
               
                session.flush();
                session.getTransaction().commit();

                uf = new Uf();
                listarTodos();
                mensagem = "sucesso";
            }
           
        } catch(Exception e) {
            session.getTransaction().rollback();
            e.printStackTrace();
            mensagem = "falha";
        } finally {
            session.close();
        }
       
        System.out.println(mensagem);
        return mensagem;
    }
Responder

Gostei + 0

31/08/2009

Henrique Weissmann

Olá, eu estou chamando o método commit(), mas não está persistindo no banco, abaixo está o código: Aleandro, segue seu código com algumas dúvidas: public String salvar() { if (!session.isOpen()) { session = HibernateUtil.getSessionFactory().openSession(); } try { session.beginTransaction(); if (dao.isExist(uf).equals(true)) { mensagem = "Já está cadastrado"; } else { dao.save(uf); session.flush(); session.getTransaction().commit(); uf = new Uf(); listarTodos(); mensagem = "sucesso"; } } catch(Exception e) { session.getTransaction().rollback(); e.printStackTrace(); mensagem = "falha"; } finally { session.close(); } System.out.println(mensagem); return mensagem; } De onde vêm esta sua instância dao? Percebi que você cira uma nova sessão logo na segunda linha de código, porém em momento algum ela é passada para esta sua instância. Será que não seria isto? Neste caso, a sua instância de DAO estaria trabalhando com uma sessão e o seu método com outra. Como uma transação é sempre independente das demais, como resultado uma teria acesso a estes objetos e a outra não.
Responder

Gostei + 0

31/08/2009

Aleandro Dalan

Desculpe, acabei passando o código pela metado, abaixo está ele completo:

package br.com.aguaviva.handler;

import java.util.List;
import org.hibernate.Session;
import br.com.aguaviva.dao.impl.UfDAOImpl;
import br.com.aguaviva.entities.Uf;
import br.com.aguaviva.util.HibernateUtil;

public class UfHandler {
    private Session session = HibernateUtil.getSessionFactory().openSession();
    private UfDAOImpl dao = new UfDAOImpl(session);
    private Uf uf = new Uf();
    private List<Uf> ufs = listarTodos();
    private String mensagem;
   
    public UfHandler() {
        listarTodos();
    }
   
    public UfHandler(Session session) {
    }
   
    public Uf getUf() {
        return uf;
    }
   
    public List<Uf> getUfs() {
        return ufs;
    }

    public String salvar() {
        if (!session.isOpen()) {
            session = HibernateUtil.getSessionFactory().openSession();
        }
       
        try {
            session.beginTransaction();
            if (dao.isExist(uf).equals(true)) {
                mensagem = "Já está cadastrado";
            } else {
                dao.save(uf);
               
                session.flush();
                session.getTransaction().commit();

                uf = new Uf();
                listarTodos();
                mensagem = "sucesso";
            }
           
        } catch(Exception e) {
            session.getTransaction().rollback();
            e.printStackTrace();
            mensagem = "falha";
        } finally {
            session.close();
        }
       
        System.out.println(mensagem);
        return mensagem;
    }
Responder

Gostei + 0

31/08/2009

Henrique Weissmann

Aleandro, o problema é exatamente o que mencionei com você anteriormente, seu DAO está trabalhando com uma sessão, e o seu método, com outra. Repare nestes trechos do seu código: Logo no início da sua classe, quando a mesma é instanciada, você executa estas linhas: private Session session = HibernateUtil.getSessionFactory().openSession(); private UfDAOImpl dao = new UfDAOImpl(session); repare, você cria uma nova instância da sessão e em seguida instancia UfDAOImpl passando esta sessão para o construtor. Em seguida, no método salvar, repare no modo como você trabalha: if (!session.isOpen()) { session = HibernateUtil.getSessionFactory().openSession(); } try { session.beginTransaction(); if (dao.isExist(uf).equals(true)) { Repare: você está redefinindo a sua instância de Session ao escrever session = HibernateUtil.getSessionFactory().openSession(); a sua variável de instância é substituida pela nova instância, mas como você já havia criado uma instância de UfDAOImpl logo na inicialização de sua classe, esta já possuia o endereço da primeira sessão. Como consequência, você alterou a sessão da sua instância de UfHandler, e não a de UfDAOImpl. No entanto, supondo que exista um método capaz de alterar a sessão da sua instância de UfDAOImpl (imaginando que seja um método como por exemplo setSession), se você passasse esta nova sessão para a sua instância, não teria este problema. Sugestão: crie uma nova instância de UfDAOImpl dentro do seu método salvar, e não ao instanciar a classe, pois assim este tipo de confusão não irá acontecer mais.
Responder

Gostei + 0

31/08/2009

Aleandro Dalan

Valeu Henrique, resolvido o problema através da sua ajuda, eu instanciei a session e o dao no início da classe como null e nos métodos salvar(), apagar(), enfim, naqueles necessários eu atribui os valores abrindo a session e carregando no construtos do dao e perfeito. Viajei legal nessa aí, rsrsrs. Pode fechar a chamada que já está resolvido.
Obrigado pela ajuda.
Abraços!
Aleandro.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar