SwingWorker não faz Update e Insert no Hibernate?

5 respostas
fernandopaiva

Salve galera…Estou enfrentando um problema que até agora não consegui encontrar uma solução.

É o seguinte, estou usando Hibernate e criei um método para Inserir e outro para Alterar informações do meu BD, então eu criei 2 métodos com SwingWorker para executar em background esses métodos de Inserir/Alterar.
O problema é que quando executo os métodos Inserir/Alterar fora do SwingWorker, eles dão o commit() normalmente no BD e alteram na hora, com o SwingWorker não, eu preciso fechar e abrir meu sistema para ver as alterações feitas, não sei o pq disso acontecer pq em teoria o SwingWorker só deveria executá-los em background.

Aqui vai meu código.

//metodo para Inserir
public void insereVinculaPerfilModuloPermissoes(){
       //este metodo vincula o perfil ao módulo com as permissões
       Session sessao = new RetornaSessaoHibernate().hibernateSession();
       sessao.beginTransaction();
       Yperfil perfil = new Yperfil();
       perfil.setId(Long.parseLong(codPerfil.getText()));
       progresso.setMinimum(0);
       progresso.setMaximum(gridPermissoesPorModulo.getRowCount());
       for(int x = 0; x < gridPermissoesPorModulo.getRowCount(); x++){
           Yperfilmodulo yPerfilModulo = new Yperfilmodulo();
           Ymodulos modulo = new Ymodulos();
           String codMod = (String)gridPermissoesPorModulo.getModel().getValueAt(x, 0);
           modulo.setId(Long.parseLong(codMod));           
           yPerfilModulo.setYperfil(perfil);           
           yPerfilModulo.setYmodulos(modulo);            
           yPerfilModulo.setInserir(gridPermissoesPorModulo.getModel().getValueAt(x, 2).toString());                      
           yPerfilModulo.setAlterar(gridPermissoesPorModulo.getModel().getValueAt(x, 3).toString());                      
           yPerfilModulo.setConsultar(gridPermissoesPorModulo.getModel().getValueAt(x, 4).toString());                      
           yPerfilModulo.setImprimir(gridPermissoesPorModulo.getModel().getValueAt(x, 5).toString()); 
           sessao.save(yPerfilModulo);           
           progresso.setValue(x);
       }
       sessao.getTransaction().commit();       
    }

//metodo para Alterar
 public void alteraVinculaPerfilModuloPermissoes(){
        //este método altera as permissoes que o perfil ja possui        
            Session sessao = new RetornaSessaoHibernate().hibernateSession();             
            sessao.beginTransaction();
            btnInserir1.setEnabled(false);
            btnAlterar1.setEnabled(false);
            btnSair1.setEnabled(false);
            DefaultTableModel tabela = (DefaultTableModel)gridPermissoesPorModulo.getModel();
            progresso.setMinimum(0);
            progresso.setMaximum(gridPermissoesPorModulo.getRowCount());                      
            SQLQuery query = sessao.createSQLQuery("UPDATE yperfilmodulo "
                                             + "SET inserir = :inserir, alterar = :alterar, consultar = :consultar, imprimir = :imprimir "
                                             + "WHERE yperfilmodulo.idperfil = :idperfil "
                                             + "AND yperfilmodulo.idmodulo = :idModulo"
                                             );
            query.setParameter("idperfil", Long.parseLong(codPerfil.getText()));
            for(int x = 0; x < tabela.getRowCount(); x++){            
                    Ymodulos modulos = new Ymodulos();
                    modulos.setId(Long.valueOf((String)gridPermissoesPorModulo.getValueAt(x, 0)));
                    query.setParameter("idModulo", modulos.getId());            
            
                    query.setParameter("inserir", gridPermissoesPorModulo.getValueAt(x, 2).toString());            
                    query.setParameter("alterar", gridPermissoesPorModulo.getValueAt(x, 3).toString());            
                    query.setParameter("consultar", gridPermissoesPorModulo.getValueAt(x, 4).toString());            
                    query.setParameter("imprimir", gridPermissoesPorModulo.getValueAt(x, 5).toString());                        
                    query.executeUpdate();                    
                    progresso.setValue(x);                
            }             
            sessao.getTransaction().commit();                          
    }


//aqui os SwingWorker 
 public void inserePermissoesWorker(){
        //worker que insere as permissões do perfil no BD
        progresso.setVisible(true);
        progresso.setStringPainted(true);
        SwingWorker w = new SwingWorker() {    
            @Override
            protected Object doInBackground() throws Exception {
                btnInserir1.setEnabled(false);
                btnAlterar1.setEnabled(false);
                btnSair1.setEnabled(false);
                insereVinculaPerfilModuloPermissoes(); //chama metodo para Inserir
                return null;
            }
            protected void done(){
                btnInserir1.setEnabled(true);
                btnAlterar1.setEnabled(true);
                btnSair1.setEnabled(true);
                progresso.setIndeterminate(false);
                progresso.setValue(0);
                progresso.setVisible(false);                
            }
        };
        w.execute();
    }


 public void alteraPermissoesWorker(){
        //worker que altera as permissões do perfil no BD
        progresso.setVisible(true);
        progresso.setStringPainted(true);
        SwingWorker w = new SwingWorker() {    
            @Override
            protected Object doInBackground() throws Exception {
                btnInserir1.setEnabled(false);
                btnAlterar1.setEnabled(false);
                btnSair1.setEnabled(false);
                alteraVinculaPerfilModuloPermissoes(); //chama metodo para Alterar
                return null;
            }
            protected void done(){
                btnInserir1.setEnabled(true);
                btnAlterar1.setEnabled(true);
                btnSair1.setEnabled(true);
                progresso.setIndeterminate(false);
                progresso.setValue(0);
                progresso.setVisible(false);
            }
        };
        w.execute();
    }


//aqui onde invoco o SwingWorker para Inserir
 private void btnInserir1ActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:
        int codP = Integer.parseInt(codPerfil.getText());
        if(codP <= 0){
            JOptionPane.showMessageDialog(null, "Escolha o perfil que deseja dar as permissões", "Informação", 1, new Metodos().alertaImg("alerta"));
            codPerfil.requestFocus();
            codPerfil.selectAll();
        }else{
            //insereVinculaPerfilModuloPermissoes(); //aqui chamo sem passar pelo SwingWorker, isto funciona 100%, não precisa fechar e abrir o sistema
            inserePermissoesWorker(); //aqui chamo pelo SwingWorker, so funciona exibe as alteracoes depois que fecho e abro o sistema.
        }
    }

Bem galera, não sei o pq disso acontecer, alguma sugestão ???

obrigado

5 Respostas

luiz_renato

Colega,

Tente colocar os métodos de tratamento do banco (edição,inserção) numa classe separada (DAO p/ ex) p/ ser chamado pelo SwingWorker e deixe o tratamento dos botões e outras coisas da GUI com o Worker.

fernandopaiva

luiz…Meus métodos ja estão assim, da maneira como vc esta sugerindo

alguma outra sugestão ?

obrigado, t+ !

luiz_renato

fernandopaiva,

Seria colocar em classes separadas e não métodos separados na mesma classe .
P. ex a classe que tem a responsabildiade de “mexer” com banco de dados não tem que saber nada sobre a barra de progresso da tela X porque essa mesma classe vai atualizar/inserir dados em/de quaisquer telas do sistema , ela tem que ter somente a responsablidade de manipular o BD.
Não sei se isso resolveria o seu problema mas vai facilitar muito. Dê uma olhada em MVC.

fernandopaiva

luiz, as minhas classes ja estão assim.

eu uso o hibernate apenas para session.save()…eu estou usando MVC(model view controller), com Hibernate e POJOs.

da uma olhada no metodo de Inserir e Alterar. Vc vai ver que pego a minha session e instancio as classes POJOs. E depois soh uso um session.save(objeto) e query.executeUpdate().

Mas em teoria, msm o metodo estando ou não dentro da classe a execução do SwingWorker deveria ser a mesma, até msm pq ja usei ele com JDBC e funcionou blzinha…Só ainda não descobri o pq de não funcionar com o Hibernate.

Ups, funciona mas tenho q fechar e abrir o sistema para exibir as alterações.

t+, obrigado

fernandopaiva

Opa galera, consegui resolver.

É o seguinte, como nunca havia mexido com hibernate, não sabia que tinha q fechar a session inclusive para os selects, entaum deixei-os todos abertos ai ele pegava da persistencia e naum do bd. Bom, ai o que eu fiz foi commitar inclusive meus selects, BINGO…100% funcional.

obrigado.

Criado 5 de agosto de 2011
Ultima resposta 5 de ago. de 2011
Respostas 5
Participantes 2