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