Update/Alter via jsf + hibernate
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)
PropriedadeDAO (faz a transaction no banco):
Página index.xhtml(primeira a ser carregada quando menu propriedade é acionado):
página alterar.xhtml(a qual eu pretendo carregar um form com os campos valorados pelo objeto (form parecido com index.xhtml ):
da uma força aeee!!!!
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
Curtidas 0
Respostas
Rafael
06/07/2016
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:
Página xhtml:
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>
GOSTEI 0