Problema ao excluir

4 respostas
rafa120

Boa noite!

Estou ha um tempo aqui tentando ver porque não está deletando um registro e gostaria de uma ajudinha ai pra desempacar nisso

Quando clico pra deletar ele passa por tudo e até mostra mensagem que foi deletado, mas no debug ele não pega o registro selecionado… fica tudo em null…mas nao acho o erro e para editar e inserir está tudo ok… quem puder me ajudar ai por favor… valeu

Estou usando hibernate, jsf, primefaces e spring security

ChangesDaoImpl

public class ChangesDaoImpl implements ChangesDao {

    @Override
    public void inserir(Changes changes) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            session.beginTransaction();
            session.save(changes);
            session.beginTransaction().commit();
        } catch (Exception e){
            System.out.println("Erro ao inserir: "+e.getMessage());
            session.beginTransaction().rollback();
        }
    }

    @Override
    public void excluir(Changes changes) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            session.beginTransaction();
            session.delete(changes);
            session.beginTransaction().commit();
        } catch (Exception e){
            System.out.println("Erro ao excluir: "+e.getMessage());
            session.beginTransaction().rollback();
        }
    }

ChangesBean

@ManagedBean(name="changesBean")
@SessionScoped
public class ChangesBean {

    private Changes change;
    private List<Changes> changes;
    
    public ChangesBean() {
        change = new Changes();
    }
    
    public void prepararInserir(){
        change = new Changes();
    }
    
    public void prepararAtualizar(Integer id){
        ChangesDao changesDao = new ChangesDaoImpl();
        change = changesDao.buscarPorId(id);
    }
    
    public void inserir(){
        ChangesDao changesDao = new ChangesDaoImpl();
        changesDao.inserir(change);
        FacesContext context = FacesContext.getCurrentInstance();         
        context.addMessage(null, new FacesMessage("Change successfully added."));
        change = new Changes();
    }
    
    public void excluir(){
        ChangesDao changesDao = new ChangesDaoImpl();
        changesDao.excluir(change);
        FacesContext context = FacesContext.getCurrentInstance();         
        context.addMessage(null, new FacesMessage("Change successfully deleted."));
        change = new Changes();
    }
    
    public Changes getChange() {
        return change;
    }

    public void setChange(Changes change) {
        this.change = change;
    }

    public List<Changes> getChanges() {
        ChangesDao changesDao = new ChangesDaoImpl();
        changes = changesDao.buscarTodos();
        return changes;
    }
    
    private List<Changes> filteredChanges;
    
    public List<Changes> getFilteredChanges() {  
        return filteredChanges;  
    }  
  
    public void setFilteredChanges(List<Changes> filteredChanges) {  
        this.filteredChanges = filteredChanges;  
    }  

}

xhtml

<h:form id="frmChanges">
                     <p:dataTable id="datatable" var="change" value="#{changesBean.changes}" emptyMessage="No changes found."
                                  paginator="true" rows="10" paginatorPosition="bottom" rowKey="#{change.id}" selectionMode="single"
                                  paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
                                  rowsPerPageTemplate="5,10,15">
                         <f:facet name="header">  
                             Search changes  
                         </f:facet>
                             
                         <p:column headerText="Change no." filterBy="#{change.changeNumber}">
                             <h:outputText value="#{change.changeNumber}" />
                         </p:column>
                             
                        //restante dos dados que aparecem na tabela
                             
                         <p:column style="width:11%; text-align: center" >  
                             <p:commandButton update=":frmView:pgView, :frmView:pgView1" oncomplete="dlgView.show()" image="icon-view" title="View" actionListener="#{changesBean.prepararAtualizar(change.id)}"/>
                             <sec:authorize ifAnyGranted="ROLE_ACC, ROLE_ADMIN">                             
                             <p:commandButton update=":frmEdit:pgEdit, :frmEdit:pgEdit1" actionListener="#{changesBean.prepararAtualizar(change.id)}" 
                                              oncomplete="dlgEdit.show()" image="icon-edit" title="Edit"/> 
                             </sec:authorize>
                             <sec:authorize ifAnyGranted="ROLE_ANA, ROLE_ADMIN">                  
                             <p:commandButton update=":frmEditipc:pgEditipc" actionListener="#{changesBean.prepararAtualizar(change.id)}" 
                                              oncomplete="dlgEditipc.show()" image="icon-edit" title="Edit"/> 
                             <p:commandButton update=":frmDelete" oncomplete="dlgDelete.show()" image="icon-delete" title="Delete"/>                  
                            </sec:authorize>
                         </p:column>
                     </p:dataTable>                 
                         
                 </h:form>

            <!-- Formulário: excluir -->
                 <h:form id="frmDelete">             
                     <p:growl id="growlDelete" sticky="true" />  
                         
                     <p:confirmDialog id="dlgDelete" message="Delete this change?"  
                                      header="Delete Change" severity="alert" widgetVar="dlgDelete">  
                                          
                         <p:commandButton value="&nbsp;Delete" update=":frmChanges:datatable, growlDelete, dlgDelete" 
                                          actionListener="#{changesBean.excluir()}" oncomplete="dlgDelete.hide()" image="icon-save"/>
                         <p:commandButton value="&nbsp;Cancel" update=":frmChanges:datatable" oncomplete="dlgDelete.hide()" 
                                          image="icon-cancel"/>                     
                     </p:confirmDialog>         
                 </h:form>

4 Respostas

drsmachado

A mensagem de sucesso ocorre por que você não faz um tratamento adequado, afinal, o fluxo da execução é contínuo

public void excluir(){  
        ChangesDao changesDao = new ChangesDaoImpl();  
        changesDao.excluir(change);  
        FacesContext context = FacesContext.getCurrentInstance();           
        context.addMessage(null, new FacesMessage("Change successfully deleted."));  
        change = new Changes();  
    }

Ou seja, independente do ocorrido ao tentar deletar, ele sempre segue sem qualquer análisa da execução da tentativa.
Não gosto muito desta abordagem, prefiro pegar o identificador do objeto, realizar uma busca através deste identificador e, só então, realizar a deleção.

Outro porém é isto

<p:commandButton update=":frmDelete" oncomplete="dlgDelete.show()" image="icon-delete" title="Delete"/>

E isto

<p:confirmDialog id="dlgDelete" message="Delete this change?"    
                                      header="Delete Change" severity="alert" widgetVar="dlgDelete">    
                                            
                         <p:commandButton value=" Delete" update=":frmChanges:datatable, growlDelete, dlgDelete"   
                                          actionListener="#{changesBean.excluir()}" oncomplete="dlgDelete.hide()" image="icon-save"/>  
                         <p:commandButton value=" Cancel" update=":frmChanges:datatable" oncomplete="dlgDelete.hide()"   
                                          image="icon-cancel"/>                       
                     </p:confirmDialog>

Talvez eu esteja meio cego, mas onde e como você identifica qual objeto está deletando?

Outro porém, você chegou a debugar para ver onde fica nulo?

rafa120

boa tarde, drsmachado

Então, a mesma forma que eu fiz o deletar está semelhante ah de atualizar por exemplo
e realmente nao estou conseguindo entender onde está o erro

No debug ele pega null em tudo =/

drsmachado

Engraçado, acho que

<p:commandButton update=":frmEditipc:pgEditipc" actionListener="#{changesBean.prepararAtualizar(change.id)}"   
                                              oncomplete="dlgEditipc.show()" image="icon-edit" title="Edit"/>

é diferente de

<p:commandButton update=":frmDelete" oncomplete="dlgDelete.show()" image="icon-delete" title="Delete"/>

rafa120

Como sou burro!
É isso mesmo, agora ele tem a referencia pra procurar
actionListener="#{changesBean.prepararAtualizar(change.id)}

aproveitando a ajuda, numa datable eu quero que carregue somente o usuário que está logado
Eu ja consegui fazer, mas aparece somente o username e os outros dados (nome, telefone) nao aparecem.

Seria da mesma forma que eu fiz no deletar?

<h:form id="frmUsers">
                                <p:dataTable id="datatable" value="#{usuarioBean.usuario.username}">
                                                   
                                    <f:facet name="header">  
                                        Search users  
                                    </f:facet>
                                    <p:column headerText="Name">
                                        <h:outputText value="#{usuarioBean.usuario.name}" />
                                    </p:column>
                                        
                                    <p:column headerText="Username" >
                                        <h:outputText value="#{usuarioBean.usuario.username}" />
                                    </p:column>
                                                                             
                                    <p:column headerText="Pool" >
                                        <h:outputText value="#{usuarioBean.usuario.authority}" />
                                    </p:column> 
                                        
                                    <p:column style="width:11%; text-align: center" >  
                                        <p:commandButton update=":frmUsers" oncomplete="carDialog.show()" image="icon-view" title="View"/>         
                                    </p:column>
                                </p:dataTable>                 
                                    
                            </h:form><br/>

usuariobean

@ManagedBean(name="usuarioBean")
@SessionScoped
public class UsuarioBean implements Serializable {
 
    private Usuario usuario;
    private List<Usuario> usuarios;
 
    public UsuarioBean() {
        usuario = new Usuario();
        SecurityContext context = SecurityContextHolder.getContext();
        if (context instanceof SecurityContext){
            Authentication authentication = context.getAuthentication();
            if (authentication instanceof Authentication){
                usuario.setUsername(((User)authentication.getPrincipal()).getUsername());
            }
        }
    }
 
    public Usuario getUsuario() {
        //return usuario;
        if (usuario == null){
            usuario = new Usuario();
        }
        return usuario;
    }
 
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    
    public void prepararInserir(){
        usuario = new Usuario();
    }
    
    public void prepararAtualizar(Integer id){
        UsuarioDao usuarioDao = new UsuarioDaoImpl();
        usuario = usuarioDao.buscarPorId(id);
    }
    
    public void inserir(){
        UsuarioDao usuarioDao = new UsuarioDaoImpl();
        usuarioDao.inserir(usuario);
        FacesContext context = FacesContext.getCurrentInstance();         
        context.addMessage(null, new FacesMessage("User successfully added."));
        usuario = new Usuario();
    }
    
    public void atualizar(){
        UsuarioDao usuarioDao = new UsuarioDaoImpl();
        usuarioDao.atualizar(usuario);
        FacesContext context = FacesContext.getCurrentInstance();         
        context.addMessage(null, new FacesMessage("User successfully updated."));
        usuario = new Usuario();
    }
    
    public void excluir(){
        UsuarioDao usuarioDao = new UsuarioDaoImpl();
        usuarioDao.excluir(usuario);
        FacesContext context = FacesContext.getCurrentInstance();         
        context.addMessage(null, new FacesMessage("User successfully deleted."));
        usuario = new Usuario();
    }
    
    public List<Usuario> getUsuarios() {
        UsuarioDao usuarioDao = new UsuarioDaoImpl();
        usuarios = usuarioDao.buscarTodos();
        return usuarios;
    }
    
    private List<Usuario> filteredUsuario;
    
    public List<Usuario> getFilteredUsuario() {  
        return filteredUsuario;  
    }  
  
    public void setFilteredUsuario(List<Usuario> filteredUsuario) {  
        this.filteredUsuario = filteredUsuario;  
    } 
   
     
}
Criado 6 de março de 2013
Ultima resposta 7 de mar. de 2013
Respostas 4
Participantes 2