19
I have a component SelectOneMenu (Primefaces)
of cities, which is loaded according to the selected state.
My component is with following behavior, right after saving the object and then selecting it on DataTable
through a commandLink
for editing, the component is loaded with the city normally, but if I leave the page and return to do the editing later, this component is not loaded.
I have already done the degug and the value of the city comes filled, but I do not know why it is not presented in the component. If anyone can help me, I have tried everything.
Address class with mappings
@Entity
@Table(name="TENDERECO", schema="SGCADM")
public class Endereco implements Serializable{
private Cidade cidade;
private Estado estado;
private Pessoa pessoa;
@JoinColumn(name = "CODCID", referencedColumnName = "CODCID")
@ForeignKey(name = "fk_endereco_cidade")
public Cidade getCidade() {
if (cidade == null) {
cidade = new Cidade();
}
return cidade;
}
public void setCidade(Cidade cidade) {
this.cidade = cidade;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "CODESTA", referencedColumnName = "CODESTA")
@ForeignKey(name = "fk_endereco_estado")
public Estado getEstado() {
if (estado == null) {
estado = new Estado();
}
return estado;
}
public void setEstado(Estado estado) {
this.estado = estado;
}
@OneToOne(targetEntity = Pessoa.class, fetch=FetchType.LAZY)
@JoinColumn(name = "CODPES", referencedColumnName = "CODPES")
@ForeignKey(name = "fk_endereco_pessoa")
public Pessoa getPessoa() {
return pessoa;
}
public void setPessoa(Pessoa pessoa) {
this.pessoa = pessoa;
}
Bean with scopo @viewScoped
@ManagedBean(name="funcionarioBean")
@ViewScoped
public class FuncionarioBean implements Serializable{
@EJB private FuncionarioBO funcionarioBO;
@EJB private CidadeBO cidadeBO;
@EJB private EstadoBO estadoBO;
@PostConstruct
public void init(){
this.listCargo = cargoBO.buscarCargos();
this.listEstado = estadoBO.buscarEstados();
this.listGerentesSupervisores = funcionarioBO.listaGerentesSupervisores();
listarFuncionarios();
}
public void populaCidades(AjaxBehaviorEvent event) throws TransactionalException {
listCidadePorEstado = cidadeBO.buscarCidadesPorEstado(getFuncionario().getEndereco().getEstado().getCodigoEstado());
}
public void salvar() throws PersistenceException, ParseException {
try {
funcionario.setDataCadastro(dataAtual);
funcionario.setTipoPessoa(TipoPessoaEnum.FISICA);
funcionario.setDataNascimento(formata.parse(DateUtils.formataData(funcionario.getDataNascimento())));
funcionario.getEndereco().setDataCadastro(dataAtual);
funcionario.getEndereco().setPessoa(funcionario);
funcionarioBO.salvarFuncionario(funcionario);
FacesUtil.info("Funcionário foi salvo com sucesso ! ");
listarFuncionarios();
limpar();
} catch (TransactionalException e) {
e.printStackTrace();
logger.error("Não foi possível salvar Funcionario ! " + e.getMessage());
FacesUtil.error(FacesMessage.SEVERITY_ERROR, "Não foi possível salvar funcionário ! ", e.getMessage());
}
}
public void editar(){
funcionario = funcionarioBO.find(funcionario.getCodigoFuncionario());
disable = false;
btnNew = true;
btnSave = false;
btnCancel = false;
}
}
Implementation of the Method buscaCidadePorEstado
public List<Cidade> buscarCidadesPorEstado(Long codigoEstado) throws TransactionalException{
Criteria cri = getSession().createCriteria(Cidade.class)
.add(Restrictions.eq("estado.codigoEstado", codigoEstado));
return cri.list();
}
selectOneMenu State and City together with commandLink searching the selected object from my datatable:
<p:selectOneMenu id="Selest" value="#{funcionarioBean.funcionario.endereco.estado.codigoEstado}" required="true" requiredMessage="O campo ESTADO é obrigatório !" style="width:175px; margin-left: 5px; font-weight:bold;" disabled="#{funcionarioBean.disable}">
<f:selectItem itemLabel="" itemValue="" />
<f:selectItems value="#{funcionarioBean.listEstado}" var="item" itemLabel="#{item.descricao}" itemValue="#{item.codigoEstado}" />
<f:ajax event="change" render="Selcid" listener="#{funcionarioBean.populaCidades}" />
</p:selectOneMenu>
<p:selectOneMenu id="Selcid" value="#{funcionarioBean.funcionario.endereco.cidade.codigoCidade}" style="width:175px; margin-left: 5px;font-weight:bold;" required="true" requiredMessage="O campo CIDADE é obrigatório !" disabled="#{funcionarioBean.disable}">
<f:selectItem itemLabel="" itemValue="" />
<f:selectItems value="#{funcionarioBean.listCidadePorEstado}" var="cid" itemLabel="#{cid.descricao}" itemValue="#{cid.codigoCidade}" />
</p:selectOneMenu>
<p:column id="edit" width="9%" style="text-align:center">
<p:commandLink action="#{funcionarioBean.editar}" ajax="false" update=":form:view">
<p:graphicImage value="/resources/img/icon/Edit16x16.png" />
<f:setPropertyActionListener value="#{obj}" target="#{funcionarioBean.funcionario}" />
</p:commandLink>
</p:column>
It is necessary to inform a convert in selectOneMenu, in many cases it is also necessary to be rewritten the Equals method. On the site of the first faces is a very complete example: http://www.primefaces.org/showcase/ui/input/oneMenu.xhtml
– Rafael Possenti
Hello! It’s been a while since I used Primefaces, but I’ve had problems like this and sometimes I could solve it by updating the component, in this case the Selectonemenu. Try to do that and let us know what happens =)
– Weslley Torres
Where is declared the listCidadePorState?
– Rafael B.
If you edit without leaving the page the change is saved normally?
– prmottajr