Update/Alter via jsf + hibernate

06/07/2016

0

Bom dia galera, antes de mais nada adianto que os fóruns que busquei não resolveram meu problema e por isso criei este.

Seguinte, sou novo em Java e estou tentando desenvolver uma Aplicação Web.... estou no básico ainda (CRUD). Os métodos create e delete estão funcioando, o problema esta no método update. Segue minha ideia:

Ao acessar o menu 'propriedades' tenho uma tela (pages/propriedade/index.xhtml) que mostra um dataTable com as propriedades previamente cadastradas junto com alguns de seus atributos e na última coluna as opções de alterar(ñ funciona) e deletar(está ok). Acima dessa dataTable tenho um botão para cadastrar novo que esta ok! Ao clicar na opção ALTERAR eu gostaria que fosse aberta para o cliente uma página igual a de cadastro só que esta página ja viria com os campos (inputs) preenchidos pelos valores da respectiva propriedade onde foi acionado o botao.

Acontece que quando clico em 'alterar' a página exibida não vem carregada com os dados do banco, fiz o teste e preenchi o form de novo com valores diferentes para verificar se estava alterando e adivinha.... não estava. Em suma estou perdido na implementação do método update, vou postar alguns trechos de códigos afim de exemplificar o problema. Qualquer ajuda é bem-vinda!


Desde já, agradeço.


PropriedadeController(meu bean)
@ManagedBean
@ViewScoped
public class PropriedadeController implements Serializable {

    private final iFunctions apiMatta;
    private Propriedade propriedade = new Propriedade();
    private final PropriedadeDao propriedadeDao;

    //private List<Propriedade> propriedades;
    private List<Estado> estados;
    private List<Cidade> cidades;
    private List<Cidade> cidadesCobranca;

    private Estado estado;
    private Estado estadoCobranca;
    private Cidade cidade;
    private Cidade cidadeCobranca;

    private TipoPessoa tipoPessoa;
    private List<TipoPessoa> tipoPessoas;

    public PropriedadeController() {
        apiMatta = new ApiMatta();
        propriedadeDao = new PropriedadeDao();
        //propriedades = new PropriedadeDao().read();
    }


    @PostConstruct
    public void init() {
        estados = apiMatta.getEstado();
        tipoPessoas = apiMatta.getTipoPessoas();
    }

    public void getCidadeList(AjaxBehaviorEvent ajaxBehaviorEvent) {
        cidades = apiMatta.getCidade(estado);
    }


    public void getCidadeCobrancaList(AjaxBehaviorEvent ajaxBehaviorEvent) {
        cidadesCobranca = apiMatta.getCidade(estadoCobranca);
    }

    public void onRowSelect(SelectEvent event) {
        propriedade = (Propriedade) event.getObject();
    }

    public String salvar() {
        try {
            propriedade.setCidade(cidade);
            propriedade.setCidadeCobranca(cidadeCobranca);
            propriedade.setTipoPessoa(tipoPessoa);
            if (propriedadeDao.inserir(propriedade)) {
                limparCampos();
                ApiMatta.addMessageSuccessful("Aviso", "Propriedade cadastrada com sucesso");
                return "index.xhtml";
            } else {
                return "";
            }
        } catch (Exception e) {
            System.out.println("ERROR SALVAR:   " + e.getMessage());
            return "";
        }

    }

    public List<Propriedade> listar() {
        try {
            limparCampos();
            return propriedadeDao.read();
        } catch (Exception e) {
            return null;
        }
    }

    public String deletar(Propriedade propriedade) {
        try {
            if (propriedadeDao.remover(propriedade)) {
                limparCampos();
                return "index.xhtml";
            } else {
                return null;
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return null;
        }

    }

    public String carregarPropriedade(Propriedade propriedade) {
        this.propriedade = propriedade;
        return "add.xhtml";
    }

    public String editarPropriedade(Propriedade propriedade) {
        this.propriedade = propriedade;

        if (propriedade != null) {
            this.propriedade.setBairro(propriedade.getBairro());
            this.propriedade.setCelular(propriedade.getCelular());
            this.propriedade.setCep(propriedade.getCep());
            this.propriedade.setCepCobranca(propriedade.getCepCobranca());
            this.propriedade.setCidade(propriedade.getCidade());
            this.propriedade.setCidadeCobranca(propriedade.getCidadeCobranca());
            this.propriedade.setCpfCnpj(propriedade.getCpfCnpj());
            this.propriedade.setEmail(propriedade.getEmail());
            this.propriedade.setEndCobranca(propriedade.getEndCobranca());
            this.propriedade.setEndCobrancaBairro(propriedade.getEndCobrancaBairro());
            this.propriedade.setEndCobrancaNumero(propriedade.getEndCobrancaNumero());
            this.propriedade.setEndLogadouro(propriedade.getEndLogadouro());
            this.propriedade.setEndLogadouroNumero(propriedade.getEndLogadouroNumero());
            this.propriedade.setId(propriedade.getId());
            this.propriedade.setIncsEstadual(propriedade.getIncsEstadual());
            this.propriedade.setNome(propriedade.getNome());
            this.propriedade.setTelefone(propriedade.getTelefone());
            this.propriedade.setTipoPessoa(propriedade.getTipoPessoa());
            this.propriedade.setTotalHectares(propriedade.getTotalHectares());
            //this.propriedade.setUsuario(propriedade.getUsuario());
        } else {
            ApiMatta.addMessageError("Erro", "Propriedade não encontrada");
            System.out.println("Propriedade não encontrada");
        }

        return "alterar.xhtml";
    }

    public String atualizarPropriedade() {

        try {
            propriedadeDao.alterar(propriedade);
            //propriedades = listar();
            limparCampos();
            ApiMatta.addMessageSuccessful("Aviso", "Atualizado com sucesso Control");
            return "index.xhtml";
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return "";
        }
    }

    public void limparCampos() {
        propriedade.setId(null);
        propriedade.setBairro("");
        propriedade.setCelular("");
        propriedade.setCep("");
        propriedade.setCepCobranca("");
        propriedade.setCpfCnpj("");
        propriedade.setEmail("");
        propriedade.setEndCobranca("");
        propriedade.setEndCobrancaBairro("");
        propriedade.setEndCobrancaNumero("");
        propriedade.setEndLogadouro("");
        propriedade.setEndLogadouroNumero("");
        propriedade.setIncsEstadual("");
        propriedade.setNome("");
        propriedade.setTelefone("");
        propriedade.setTipoPessoa(new TipoPessoa());
        propriedade.setTotalHectares(0.0);
        propriedade.setCidade(new Cidade());
        propriedade.setCidadeCobranca(new Cidade());
        //propriedade.setUsuario(null);
    }


PropriedadeDAO (faz a transaction no banco):
public class PropriedadeDao implements iCRUD<Propriedade> {

    private Session session;
    private Transaction transaction;

    @Override
    public boolean inserir(Propriedade propriedade) {
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            transaction = session.beginTransaction();

            session.save(propriedade);

            transaction.commit();
            return true;
        } catch (Exception e) {
            transaction.rollback();
            return false;
        } finally {
            session.close();
        }

    }

    @Override
    public List<Propriedade> read() {
        try {
            return HibernateUtil.getSessionFactory().openSession().createCriteria(Propriedade.class).list();
        } catch (Exception e) {
            return null;
        }
    }

    @Override
    public boolean remover(Propriedade propriedade) {
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            transaction = session.beginTransaction();

            session.delete(propriedade);
            transaction.commit();
            return true;
        } catch (Exception e) {
            transaction.rollback();
            System.out.println(e.getMessage());
            return false;
        } finally {
            session.close();
        }
    }

    @Override
    public boolean alterar(Propriedade propriedade) {
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            transaction = session.beginTransaction();
            session.merge(propriedade);
            transaction.commit();

            return true;
        } catch (Exception e) {
            transaction.rollback();
            e.printStackTrace();
            return false;
        } finally {
            session.close();
        }

    }

}


Página index.xhtml(primeira a ser carregada quando menu propriedade é acionado):
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:c="http://java.sun.com/jsp/jstl/core"
                xmlns:p="http://primefaces.org/ui" template="../main.xhtml">

    <ui:define name="content">
        <h:form id="fmPropriedade">
            <p:menu toggleable="true" style="font-size: 15px;" >                
                <p:menuitem value="Novo" url="add.xhtml" icon="ui-icon-copy"/>                                    
            </p:menu>
            <br/>

            <p:dataTable id="actorsTable" var="propriedade" 
                         value="#{propriedadeController.listar()}" selectionMode="single"
                         rowKey="#{propriedade.id}" paginator="true" rows="20"
                         paginatorTemplate="       "
                         rowsPerPageTemplate="5,10,15" paginatorPosition="bottom" >

                <p:column headerText="Codigo" style="width: 100px;">
                    <h:outputText value="#{propriedade.id}"/>
                </p:column>
                <p:column headerText="Nome" style="width: 300px;">
                    <h:outputText value="#{propriedade.nome}" />
                </p:column>
                <p:column headerText="Telefone" style="width: 140px; text-align: center;">
                    <h:outputText value="#{propriedade.telefone}" />
                </p:column>
                <p:column headerText="Cidade" style="width: 140px; text-align: center;">
                    <h:outputText value="#{propriedade.cidade.nome}" />
                </p:column>
                <p:column headerText="Cidade Cobrança" style="width: 140px; text-align: center;">
                    <h:outputText value="#{propriedade.cidadeCobranca.nome}" />
                </p:column>
                <p:column headerText="Tipo Pessoa" style="width: 140px; text-align: center;">
                    <h:outputText value="#{propriedade.tipoPessoa.descricao}" />
                </p:column>
                <p:column headerText="Ações" style="width: 100px; text-align: center;">
                    <p:commandButton icon="ui-icon-exchange" class="btn btn-primary btn-sm" title="Alterar" update=":fmPropriedade"
                                     action="#{propriedadeController.editarPropriedade(propriedade)}" >                       
                    </p:commandButton>
                    <p:commandButton icon="ui-icon-trash" class="btn btn-danger btn-sm" title="Remover" update=":fmPropriedade"
                                     action="#{propriedadeController.deletar(propriedade)}" >                            
                        <p:confirm header="Confirmação" message="Deseja realmente deletar esta propriedade?" icon="ui-icon-alert" />
                    </p:commandButton>
                </p:column>
            </p:dataTable>
            <!--Confirmação deletar-->
            <p:confirmDialog global="true" showEffect="fade" hideEffect="explode">
                <p:commandButton value="Sim" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
                <p:commandButton value="Não" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close" />
            </p:confirmDialog>
        </h:form>       
    </ui:define>
</ui:composition>


página alterar.xhtml(a qual eu pretendo carregar um form com os campos valorados pelo objeto (form parecido com index.xhtml ):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:c="http://java.sun.com/jsp/jstl/core"
                xmlns:p="http://primefaces.org/ui" template="../main.xhtml">

    <ui:define name="content">
         <h:form>           
            <!--Cadastro de propriedade -->            
            <p:panelGrid columns="2" columnClasses="ui-grid-col-0, ui-grid-col-1" layout="grid" styleClass="ui-panelgrid-blank">
                <p:outputLabel value="Nome: "/>
                <p:inputText value="#{propriedadeController.propriedade.nome}" required="true" maxlength="60"/>
                <p:outputLabel value="Hectares: "/>
                <p:inputText value="#{propriedadeController.propriedade.totalHectares}"  required="true" maxlength="6"/>
                <p:outputLabel value="CPF/CNPJ: "/>
                <p:inputText value="#{propriedadeController.propriedade.cpfCnpj}" required="true" maxlength="14"/>
                <p:outputLabel value="Insc. Estadual: "/>
                <p:inputText value="#{propriedadeController.propriedade.incsEstadual}" required="true" maxlength="20"/>
                <p:outputLabel value="Logradouro: "/>
                <p:inputText value="#{propriedadeController.propriedade.endLogadouro}" required="true" maxlength="75"/>
                <p:outputLabel value="Numero: "/>
                <p:inputText value="#{propriedadeController.propriedade.endLogadouroNumero}" required="true" maxlength="6"/>
                <p:outputLabel value="Bairro: "/>
                <p:inputText value="#{propriedadeController.propriedade.bairro}" required="true" maxlength="45"/>
                <p:outputLabel value="Cep: "/>
                <p:inputMask mask="99999-999" value="#{propriedadeController.propriedade.cep}" required="true" />                    

                <p:outputLabel value="Telefone: "/>
                <p:inputMask mask="(99)9999-9999" value="#{propriedadeController.propriedade.telefone}" required="true"/>
                <p:outputLabel value="Celular: "/>
                <p:inputMask mask="(99)99999-9999" value="#{propriedadeController.propriedade.celular}" required="true"/>
                <p:outputLabel value="Email: "/>
                <p:inputText  value="#{propriedadeController.propriedade.email}" required="true" />

                <p:outputLabel value="Tipo pessoa: " />
                <p:selectOneMenu id="tipoPessoa" style="width: 200px;" value="#{propriedadeController.tipoPessoa}" converter="tipoPessoaConverter">
                    <f:selectItem itemLabel="Selecione" />
                    <f:selectItems value="#{propriedadeController.tipoPessoas}" var="tp" itemValue="#" itemLabel="#{tp.descricao}" />
                </p:selectOneMenu>

                <p:outputLabel value="Estado: " />
                <p:selectOneMenu id="estado" value="#{propriedadeController.estado}" style="width: 200px;" converter="estadoConverter"
                                 required="true" requiredMessage="Preenchimento do estado e da cidade obrigatórios">
                    <f:selectItem itemLabel="Selecione" />
                    <f:selectItems value="#{propriedadeController.estados}" var="e" itemValue="#" itemLabel="#{e.sigla}" />
                    <p:ajax update="cidade" event="change" listener="#{propriedadeController.getCidadeList}"/>
                </p:selectOneMenu>

                <p:outputLabel value="Cidade: " />
                <p:selectOneMenu id="cidade" style="width: 200px;" value="#{propriedadeController.cidade}" converter="cidadeConverter">
                    <f:selectItem itemLabel="Selecione" />
                    <f:selectItems value="#{propriedadeController.cidades}" var="c" itemValue="#" itemLabel="#{c.nome}" />
                </p:selectOneMenu>    

                <p:outputLabel value=""/>
                <p:outputLabel value=""/>
                <p:outputLabel value=""/>
                <p:outputLabel value=""/>
                <p:outputLabel value="Dados de cobrança: "/>
                <p:outputLabel value=""/>
                <p:outputLabel value="Estado: " />
                <p:selectOneMenu id="estadoCobranca" style="width: 200px;" value="#{propriedadeController.estadoCobranca}" converter="estadoConverter">
                    <f:selectItem itemLabel="Selecione" />
                    <f:selectItems value="#{propriedadeController.estados}" var="e" itemValue="#" itemLabel="#{e.sigla}" />
                    <p:ajax update="cidadeCobranca" event="change" listener="#{propriedadeController.getCidadeCobrancaList}"/>
                </p:selectOneMenu>

                <p:outputLabel value="Cidade: " />
                <p:selectOneMenu id="cidadeCobranca" style="width: 200px" value="#{propriedadeController.cidadeCobranca}" converter="cidadeConverter">
                    <f:selectItem itemLabel="Selecione" />
                    <f:selectItems value="#{propriedadeController.cidadesCobranca}" var="c" itemValue="#" itemLabel="#{c.nome}" />
                </p:selectOneMenu>

                <p:outputLabel value="Logadouro "/>
                <p:inputText value="#{propriedadeController.propriedade.endCobranca}" maxlength="75"/>
                <p:outputLabel value="Numero: "/>
                <p:inputText value="#{propriedadeController.propriedade.endCobrancaNumero}" maxlength="6" />
                <p:outputLabel value="Bairro: "/>
                <p:inputText value="#{propriedadeController.propriedade.endCobrancaBairro}" maxlength="45"/>
                <p:outputLabel value="Cep: "/>
                <p:inputMask mask="99999-999" value="#{propriedadeController.propriedade.cepCobranca}"/> 

                <p:outputLabel value=""/>
                <p:outputLabel value=""/>
                <p:outputLabel value=""/>
                <p:outputLabel value=""/>

                <h:commandButton value="Salvar Alteração" action="#{propriedadeController.atualizarPropriedade()}"/>
            </p:panelGrid>
        </h:form>

    </ui:define>
</ui:composition>



da uma força aeee!!!!
Rafael

Rafael

Responder

Posts

07/07/2016

Rafael

Para fins de teste mudei o escopo do bean de @view para @session para ver se a lógica funcionava e sim, os campos foram preenchidos com exceção do drop-down Cidade. Este campo não carrega a cidade selecionada anteriormente, o engraçado é que o drop-down de Estado funciona e traz o valor do estado selecionado anteriormente. O mais engraçado é que para pegar o valor do estado eu preciso passar pela cidade(devido relacionamentos do banco) e quando preciso parar na cidade não consigo o valor. Responde aeee

bean:
@ManagedBean
@SessionScoped
public class PropriedadeController implements Serializable {

    private final iFunctions apiMatta;
    private Propriedade propriedade = new Propriedade();
    private final PropriedadeDao propriedadeDao;

    //private List<Propriedade> propriedades;
    private List<Estado> estados;
    private List<Cidade> cidades;
    private List<Cidade> cidadesCobranca;

    private Estado estado;
    private Estado estadoCobranca;
    private Cidade cidade;
    private Cidade cidadeCobranca;

    private TipoPessoa tipoPessoa;
    private List<TipoPessoa> tipoPessoas;

    /**
     * Construtor de PropriedadeController responsavel por inicializar objetos;
     */
    public PropriedadeController() {
        apiMatta = new ApiMatta();
        propriedadeDao = new PropriedadeDao();
        //propriedades = new PropriedadeDao().read();
    }

    @PostConstruct
    public void init() {
        estados = apiMatta.getEstado();
        tipoPessoas = apiMatta.getTipoPessoas();
    }

    public void getCidadeList(AjaxBehaviorEvent ajaxBehaviorEvent) {
        cidades = apiMatta.getCidade(estado);
    }

    public void getCidadeCobrancaList(AjaxBehaviorEvent ajaxBehaviorEvent) {
        cidadesCobranca = apiMatta.getCidade(estadoCobranca);
    }

    public void onRowSelect(SelectEvent event) {
        propriedade = (Propriedade) event.getObject();
    }

    public List<Propriedade> listar() {
        try {
            limparCampos();
            return propriedadeDao.read();
        } catch (Exception e) {
            return null;
        }
    }

    public String editarPropriedade(Propriedade propriedade) {
        this.propriedade = propriedade;

        this.estado = propriedade.getCidade().getEstado();
        this.estadoCobranca = propriedade.getCidadeCobranca().getEstado();

        this.propriedade.setCidade(cidade);
        this.propriedade.setCidadeCobranca(cidadeCobranca);
        //this.cidade = propriedade.getCidade();
        //this.cidadeCobranca = propriedade.getCidadeCobranca();

        this.tipoPessoa = propriedade.getTipoPessoa();

        return "alterar.xhtml";
    }

    public String atualizarPropriedade() {
        try {
            propriedadeDao.alterar(propriedade);
            //propriedades = listar();
            limparCampos();
            ApiMatta.addMessageSuccessful("Aviso", "Atualizado com sucesso Control");
            return "index.xhtml";
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return "";
        }
    }

//demais métodos
//getter & setter 



Página xhtml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:c="http://java.sun.com/jsp/jstl/core"
                xmlns:p="http://primefaces.org/ui" template="../main.xhtml">

    <ui:define name="content">
         <h:form>           
            <!--Cadastro de propriedade -->            
            <p:panelGrid columns="2" columnClasses="ui-grid-col-0, ui-grid-col-1" layout="grid" styleClass="ui-panelgrid-blank">


                <p:outputLabel value="Tipo pessoa: " />
                <p:selectOneMenu id="tipoPessoa" style="width: 200px;" value="#{propriedadeController.tipoPessoa}" converter="tipoPessoaConverter">
                    <f:selectItem itemLabel="Selecione" />
                    <f:selectItems value="#{propriedadeController.tipoPessoas}" var="tp" itemValue="#" itemLabel="#{tp.descricao}" />
                </p:selectOneMenu>

                <p:outputLabel value="Estado: " />
                <p:selectOneMenu id="estado" value="#{propriedadeController.estado}" style="width: 200px;" converter="estadoConverter"
                                 required="true" requiredMessage="Preenchimento do estado e da cidade obrigatórios">
                    <f:selectItem itemLabel="Selecione" />
                    <f:selectItems value="#{propriedadeController.estados}" var="e" itemValue="#" itemLabel="#{e.sigla}" />
                    <p:ajax update="cidade" event="change" listener="#{propriedadeController.getCidadeList}"/>
                </p:selectOneMenu>

                <p:outputLabel value="Cidade: " />
                <p:selectOneMenu id="cidade" style="width: 200px;" value="#{propriedadeController.cidade}" converter="cidadeConverter">
                    <f:selectItem itemLabel="Selecione" />
                    <f:selectItems value="#{propriedadeController.cidades}" var="c" itemValue="#" itemLabel="#{c.nome}" />
                </p:selectOneMenu>    

                <p:outputLabel value=""/>
                <p:outputLabel value=""/>
                <p:outputLabel value=""/>
                <p:outputLabel value="Dados de cobrança: "/>
                <p:outputLabel value=""/>
                <p:outputLabel value="Estado: " />
                <p:selectOneMenu id="estadoCobranca" style="width: 200px;" value="#{propriedadeController.estadoCobranca}" converter="estadoConverter">
                    <f:selectItem itemLabel="Selecione" />
                    <f:selectItems value="#{propriedadeController.estados}" var="e" itemValue="#" itemLabel="#{e.sigla}" />
                    <p:ajax update="cidadeCobranca" event="change" listener="#{propriedadeController.getCidadeCobrancaList}"/>
                </p:selectOneMenu>

                <p:outputLabel value="Cidade: " />
                <p:selectOneMenu id="cidadeCobranca" style="width: 200px" value="#{propriedadeController.cidadeCobranca}" converter="cidadeConverter">
                    <f:selectItem itemLabel="Selecione" />
                    <f:selectItems value="#{propriedadeController.cidadesCobranca}" var="c" itemValue="#" itemLabel="#{c.nome}" />
                </p:selectOneMenu>

                <p:outputLabel value=""/>
                <p:outputLabel value=""/>

                <h:commandButton value="Salvar Alteração" action="#{propriedadeController.atualizarPropriedade()}"/>
            </p:panelGrid>
        </h:form>

    </ui:define>
</ui:composition>

Responder

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

Aceitar