Olá pessoal.
Estou com uma dificuldade aqui.
Criei uma tela com vários campos para cadastro de funcionários. Consiste em um dataTable com dois botões logo abaixo (novo e editar). O dataTable está com a opção Selection ativada, sendo assim, no momento que o usuário clicar em alguma linha ele setará aquele registro para o objeto do meu ManegedBean. No momento em que o usuário clicar em editar é aberto um dialog e eu consigo editar este objeto normalmente. O problema é que se eu tentar criar um novo objeto clicando em “novo” ele carrega os dados do objeto anterior. No momento em que ele clica em novo é chamada uma função que setá novos objetos além de um update no componente responsável por renderizar a tela, mesmo assim não tive sucesso. Se alguém puder me dar alguma dica, desde já agradeço.
Abaixo um treço do meu código:
Meu DataTable
<p:dataTable value="#{funcionarioBean.funcionarios}" var="funcionario"
paginator="true" rows="50" selection="#{funcionarioBean.funcionario}"
selectionMode="single" rowKey="#{funcionario.id}" >
<p:ajax event="rowSelect" update=":novo" />
<p:column headerText="Código">
#{funcionario.id}
</p:column>
<p:column headerText="Nome">
#{funcionario.pessoa.nome}
</p:column>
<p:column headerText="Telefone">
#{funcionario.pessoa.telefone}
</p:column>
<p:column headerText="Celular">
#{funcionario.pessoa.celular}
</p:column>
<f:facet name="footer">
<p:commandButton value="Novo Funcionário" id="newFuncionarioButton"
action="#{funcionarioBean.novo}" onclick="nf.show()" type="button" >
<f:ajax event="click" update=":novo" />
</p:commandButton>
<p:commandButton value="Editar Funcionário" id="editFuncionarioButton"
type="button" onclick="nf.show()" />
</f:facet>
</p:dataTable>
Meu CRUD com meu cadastro:
<h:form id="novo">
<p:dialog id="newFuncionario" header="Novo Funcionário" widgetVar="nf" modal="true" >
<p:ajax event="close" update=":listagem" />
<p:tabView id="tabView">
<p:tab id="tab1" title="Dados Pessoais" >
<fieldset>
<legend>Dados Pessoais</legend>
<h:panelGrid columns="2" >
<h:outputText value="Nome: *" />
<p:inputText id="nome" value="#{funcionarioBean.funcionario.pessoa.nome}" maxlength="150" size="150" />
<h:outputText value="Telefone: " />
<h:panelGrid columns="5" >
<p:inputMask id="telefone" value="#{funcionarioBean.funcionario.pessoa.telefone}" maxlength="10" mask="(99)9999-9999" />
<h:outputText value="Celular: " />
<p:inputMask id="celular" value="#{funcionarioBean.funcionario.pessoa.celular}" maxlength="10" mask="(99)9999-9999" />
<h:outputText value="Fax: " />
<p:inputMask id="fax" value="#{funcionarioBean.funcionario.pessoa.fax}" maxlength="10" mask="(99)9999-9999" />
</h:panelGrid>
<h:outputText value="Email: " />
<p:inputText id="email" value="#{funcionarioBean.funcionario.pessoa.email}" maxlength="50" size="50" />
<h:outputText value="Endereço:" />
<h:panelGrid columns="4" >
<p:selectOneMenu value="#{funcionarioBean.idTipoLogradouro}" >
<f:selectItem itemLabel="Selecione um Tipo de Logradouro..." itemValue="" />
<f:selectItems value="#{funcionarioBean.tiposLogradouros}" var="tipoLogradouro" itemValue="#{tipoLogradouro.id}" itemLabel="#{tipoLogradouro.descricao}" />
</p:selectOneMenu>
<p:inputText id="endereco" value="#{funcionarioBean.funcionario.pessoa.endereco.logradouro}" maxlength="50" size="80" />
<h:outputText value="Nº:" />
<p:inputText id="numero" value="#{funcionarioBean.funcionario.pessoa.endereco.numero}" maxlength="20" size="20" />
</h:panelGrid>
<h:outputText value="Complemento:" />
<h:panelGrid columns="4" >
<p:inputText id="complemento" value="#{funcionarioBean.funcionario.pessoa.endereco.complemento}" maxlength="50" size="50" />
<h:outputText value="CEP:" />
<p:inputMask id="cep" value="#{funcionarioBean.funcionario.pessoa.endereco.cep}" maxlength="7" size="10" mask="99999-999" />
</h:panelGrid>
<h:outputText value="Estado:" />
<h:panelGrid columns="4" >
<p:selectOneMenu value="#{funcionarioBean.idEstado}" >
<f:selectItem itemLabel="Selecione um Estado..." itemValue="" />
</p:selectOneMenu>
<h:outputText value="Municipio:" />
<p:selectOneMenu value="#{funcionarioBean.idEstado}" >
<f:selectItem itemLabel="Selecione um Municipio..." itemValue="" />
</p:selectOneMenu>
</h:panelGrid>
<h:outputText value="Observação: " />
<p:inputTextarea id="obs" value="#{funcionarioBean.funcionario.pessoa.observacao}" maxlength="255" size="255" />
</h:panelGrid>
</fieldset>
</p:tab>
<p:tab id="tab2" title="Dados Profissionais" >
<fieldset>
<legend>Dados Profissionais</legend>
<h:panelGrid columns="2" >
<h:outputText value="Cargo: " />
<p:selectOneMenu value="#{funcionarioBean.idCargo}" >
<f:selectItem itemLabel="Selecione um cargo..." itemValue="" />
<f:selectItems value="#{funcionarioBean.cargos}" var="cargo" itemValue="#{cargo.id}" itemLabel="#{cargo.nome}" />
</p:selectOneMenu>
<h:outputText value="Salário R$:" />
<p:inputText value="#{funcionarioBean.funcionario.salario}" size="10" required="true" />
</h:panelGrid>
</fieldset>
</p:tab>
</p:tabView>
Por fim, meu ManagedBean
package br.flexweb.beans;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import br.flexweb.dao.CargoDAO;
import br.flexweb.dao.EnderecoDAO;
import br.flexweb.dao.FuncionarioDAO;
import br.flexweb.dao.PessoaDAO;
import br.flexweb.dao.TipoLogradouroDAO;
import br.flexweb.models.Cargo;
import br.flexweb.models.Endereco;
import br.flexweb.models.Funcionario;
import br.flexweb.models.Pessoa;
import br.flexweb.models.TipoLogradouro;
@ViewScoped
@ManagedBean
public class FuncionarioBean {
private Funcionario funcionario = new Funcionario();
private Pessoa pessoa = new Pessoa();
private Endereco endereco = new Endereco();
private TipoLogradouro tipoLogradouro = new TipoLogradouro();
private FuncionarioDAO daoFunc = new FuncionarioDAO();
private TipoLogradouroDAO daoLog = new TipoLogradouroDAO();
private CargoDAO daoCargo = new CargoDAO();
private EnderecoDAO daoEnd = new EnderecoDAO();
private PessoaDAO daoPessoa = new PessoaDAO();
private List<Funcionario> funcionarios;
private List<Cargo> cargos;
private List<TipoLogradouro> tiposLogradouros;
private Funcionario funcionarioSelecionado;
private Integer idTipoLogradouro;
private Integer idCargo;
private Integer idEstado;
private Integer idMunicipio;
public FuncionarioBean() {
pessoa.setEndereco(endereco);
funcionario.setPessoa(pessoa);
}
public void novo(){
this.pessoa = new Pessoa();
this.funcionario = new Funcionario();
this.pessoa.setEndereco(endereco);
this.funcionario.setPessoa(pessoa);
}
public void cancelar() {
limparFormulario();
}
public Funcionario getFuncionario() {
return funcionario;
}
public void setFuncionario(Funcionario funcionario) {
this.funcionario = funcionario;
}
private void limparFormulario() {
this.funcionario = new Funcionario();
this.funcionarios = daoFunc.lista();
idCargo = null;
idTipoLogradouro = null;
}
public List<Funcionario> getFuncionarios() {
if (funcionarios == null) {
this.funcionarios = daoFunc.lista();
}
return funcionarios;
}
public void gravar() {
System.out.println("VARIAVEL - " + idTipoLogradouro);
if (funcionario.getId() == null) {
funcionario.setCargo(daoCargo.busca(idCargo));
endereco.setTipoLogradouro(new TipoLogradouroDAO()
.busca(idTipoLogradouro));
daoEnd.adicionar(endereco);
daoPessoa.adicionar(pessoa);
daoFunc.adicionar(funcionario);
} else {
daoPessoa.atualizar(funcionario.getPessoa());
daoEnd.atualizar(funcionario.getPessoa().getEndereco());
daoFunc.atualizar(funcionario);
}
limparFormulario();
}
public void remover(Funcionario funcionario) {
daoFunc.remover(funcionario);
limparFormulario();
}
public Funcionario getFuncionarioSelecionado() {
return funcionarioSelecionado;
}
public void setFuncionarioSelecionado(Funcionario funcionarioSelecionado) {
this.funcionarioSelecionado = funcionarioSelecionado;
}
public Integer getIdTipoLogradouro() {
return idTipoLogradouro;
}
public void setIdTipoLogradouro(Integer idTipoLogradouro) {
this.idTipoLogradouro = idTipoLogradouro;
}
public Integer getIdCargo() {
return idCargo;
}
public void setIdCargo(Integer idCargo) {
this.idCargo = idCargo;
}
public List<Cargo> getCargos() {
if (cargos == null)
cargos = daoCargo.lista();
return cargos;
}
public void setCargos(List<Cargo> cargos) {
this.cargos = cargos;
}
public Pessoa getPessoa() {
return pessoa;
}
public void setPessoa(Pessoa pessoa) {
this.pessoa = pessoa;
}
public Endereco getEndereco() {
return endereco;
}
public void setEndereco(Endereco endereco) {
this.endereco = endereco;
}
public TipoLogradouro getTipoLogradouro() {
return tipoLogradouro;
}
public void setTipoLogradouro(TipoLogradouro tipoLogradouro) {
this.tipoLogradouro = tipoLogradouro;
}
public List<TipoLogradouro> getTiposLogradouros() {
if (tiposLogradouros == null)
tiposLogradouros = daoLog.lista();
return tiposLogradouros;
}
public void setTiposLogradouros(List<TipoLogradouro> tiposLogradouros) {
this.tiposLogradouros = tiposLogradouros;
}
public Integer getIdEstado() {
return idEstado;
}
public void setIdEstado(Integer idEstado) {
this.idEstado = idEstado;
}
public Integer getIdMunicipio() {
return idMunicipio;
}
public void setIdMunicipio(Integer idMunicipio) {
this.idMunicipio = idMunicipio;
}
}
Lembrando que não existem form aninhados na minha aplicação.
Obrigado