I've been searching the days and could not find a solution.
The scenario and the following:
I have an employee registration screen and an employee edit screen with two classes a pessoa
where I have generic property like name, address and class funcionário
where I have property as salary, charge etc.
It is saved right and displaying in the report's report for possible deletion or editing.
My problem is when I am on the report screen and I click on the edit button, it takes me to the registration screen already with the data of the employee, but the data of class pessoa
is not coming.
I've been able to make it return in the field name Id
, plus it should return nome
.
Below is the code made so far:
Registration form
<!DOCTYPE html>
<ui:composition template="/WEB-INF/template/Layout.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui">
<f:metadata>
<o:viewParam name="id" value="#{cadastroFuncionarioBean.funcionario}" />
<f:viewAction action="#{cadastroFuncionarioBean.prepararCadastro}" />
</f:metadata>
<ui:define name="titulo">Cadastro RH</ui:define>
<ui:define name="corpo">
<h1>Cadastro de Funcionários</h1>
<h:form id="frm">
<p:messages showDetail="false" showSummary="true" autoUpdate="true" />
<h3>Dados Pessoais</h3>
<p:panelGrid columns="4">
<p:outputLabel value="Nome" for="nome" />
<p:autoComplete id="nome" size="60"
value="#{cadastroFuncionarioBean.funcionario.pessoa}"
completeMethod="#{cadastroFuncionarioBean.pesquisarNomes}" />
<p:outputLabel value="Cpf" for="cpf" />
<p:autoComplete id="cpf" size="14"
value="#{cadastroFuncionarioBean.funcionario.cpf}"
completeMethod="#{cadastroFuncionarioBean.pesquisarCpfs}" />
<p:outputLabel value="Tipo" for="sexo" />
<p:selectOneButton id="sexo"
value="#{cadastroFuncionarioBean.funcionario.sexo}">
<f:selectItems
value="#{cadastroFuncionarioBean.tiposFuncionarios}"
var="tipoFuncionario" itemValue="#{tipoFuncionario}"
itemLabel="#{tipoFuncionario.sexo}" />
</p:selectOneButton>
</p:panelGrid>
<h3>Endereço</h3>
<p:panelGrid columns="4">
<p:outputLabel value="Endereço" for="endereco" />
<p:autoComplete id="endereco" size="60"
value="#{cadastroFuncionarioBean.pessoa.endereco}"
completeMethod="#{cadastroFuncionarioBean.pesquisarEnderecos}" />
<p:outputLabel value="Numero" for="numero" />
<p:autoComplete id="numero" size="6"
value="#{cadastroFuncionarioBean.pessoa.numero}"
completeMethod="#{cadastroFuncionarioBean.pesquisarNumeros}" />
<p:outputLabel value="Complemento" for="complemento" />
<p:autoComplete id="complemento" size="20"
value="#{cadastroFuncionarioBean.pessoa.complemento}"
completeMethod="#{cadastroFuncionarioBean.pesquisarComplementos}" />
<p:outputLabel value="Bairro" for="bairro" />
<p:autoComplete id="bairro" size="30"
value="#{cadastroFuncionarioBean.pessoa.bairro}"
completeMethod="#{cadastroFuncionarioBean.pesquisarBairros}" />
<p:outputLabel value="Cidade" for="cidade" />
<p:autoComplete id="cidade" size="30"
value="#{cadastroFuncionarioBean.pessoa.cidade}"
completeMethod="#{cadastroFuncionarioBean.pesquisarCidades}" />
<p:outputLabel value="Estado" for="estado" />
<p:autoComplete id="estado" size="2"
value="#{cadastroFuncionarioBean.pessoa.estado}"
completeMethod="#{cadastroFuncionarioBean.pesquisarEstados}" />
<p:outputLabel value="Cep" for="cep" />
<p:autoComplete id="cep" size="9"
value="#{cadastroFuncionarioBean.pessoa.cep}"
completeMethod="#{cadastroFuncionarioBean.pesquisarCeps}" />
</p:panelGrid>
<h3>Dados de Admissão</h3>
<p:panelGrid columns="2">
<p:outputLabel value="Cargo" for="cargo" />
<p:autoComplete id="cargo" size="60"
value="#{cadastroFuncionarioBean.funcionario.cargo}"
completeMethod="#{cadastroFuncionarioBean.pesquisarCargos}" />
<p:outputLabel value="Salário" />
<p:inputText size="12"
value="#{cadastroFuncionarioBean.funcionario.salario}"
label="salario">
<f:convertNumber locale="pt_BR" maxFractionDigits="2"
minFractionDigits="2" />
</p:inputText>
<p:outputLabel value="Data de Admissão" for="dataAdmissao" />
<p:calendar id="dataAdmissao" size="12" pattern="dd/MM/yyyy"
value="#{cadastroFuncionarioBean.funcionario.dataAdmissao}">
<p:ajax event="dateSelect" update="@this dataAdmissao"
process="@this dataAdmissao"
listener="#{cadastroFuncionarioBean.dataAdmissaoAlterada}" />
</p:calendar>
</p:panelGrid>
<p:commandButton value="Salvar"
action="#{cadastroFuncionarioBean.salvar}" icon="ui-icon-disk"
update="@form" />
</h:form>
</ui:define>
</ui:composition>
Report screen for possible deletion or editing
<!DOCTYPE html>
<ui:composition template="/WEB-INF/template/Layout.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<f:metadata>
<f:viewAction action="#{consultaFuncionariosBean.consultar}" />
</f:metadata>
<ui:define name="titulo">Consulta do RH</ui:define>
<ui:define name="corpo">
<h1>Consulta de Funcionarios</h1>
<h:form id="frm">
<p:messages showDetail="false" showSummary="true" autoUpdate="true" />
<p:dataTable value="#{consultaFuncionariosBean.funcionarios}"
var="funcionario" border="1" cellspacing="0" cellpadding="2"
paginator="true" rows="5" paginatorPosition="bottom">
<p:column headerText="Pessoa" sortBy="#{funcionario.pessoa.nome}">
<h:outputText value="#{funcionario.pessoa.nome}" />
</p:column>
<p:column headerText="Cargo" sortBy="#{funcionario.cargo}">
<h:outputText value="#{funcionario.cargo}" />
</p:column>
<p:column headerText="Sexo">
<h:outputText value="#{funcionario.sexo}" />
</p:column>
<p:column headerText="Salário" style="text-align: right"
sortBy="#{funcionario.salario}">
<h:outputText value="#{funcionario.salario}">
<f:convertNumber type="currency" locale="pt_BR" />
</h:outputText>
</p:column>
<p:column headerText="Data de Admissão" style="text-align: center"
sortBy="#{funcionario.dataAdmissao}">
<h:outputText value="#{funcionario.dataAdmissao}">
<f:convertDateTime pattern="dd/MM/yyyy"
timeZone="America/Sao_Paulo" />
</h:outputText>
</p:column>
<p:column headerText="Data de Demissão" style="text-align: center"
sortBy="#{funcionario.dataDemissao}">
<h:outputText value="#{funcionario.dataDemissao}">
<f:convertDateTime pattern="dd/MM/yyyy"
timeZone="America/Sao_Paulo" />
</h:outputText>
</p:column>
<p:column>
<p:button icon="ui-icon-pencil" title="Editar"
outcome="/CadastroFuncionario">
<f:param name="id" value="#{funcionario.id}" />
</p:button>
<p:commandButton icon="ui-icon-trash" title="Excluir"
process="@this" update="@form"
action="#{consultaFuncionariosBean.excluir}">
<f:setPropertyActionListener value="#{funcionario}"
target="#{consultaFuncionariosBean.funcionarioSelecionado}" />
</p:commandButton>
</p:column>
</p:dataTable>
</h:form>
</ui:define>
</ui:composition>
Class person
package br.com.model;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty;
@Entity
@Table(name = "pessoa")
public class Pessoa implements Serializable {
private static final long serialVersionUID = 1L;
Long id;
private String nome;
private String endereco;
private String numero;
private String complemento;
private String bairro;
private String cidade;
private String estado;
private String cep;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@NotEmpty
@Size(max = 100)
@Column(length = 100, nullable = false)
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@NotEmpty
@Size(max = 100)
@Column(length = 100, nullable = false)
public String getEndereco() {
return endereco;
}
public void setEndereco(String endereco) {
this.endereco = endereco;
}
@NotEmpty
@Size(max = 6)
@Column(length = 6, nullable = false)
public String getNumero() {
return numero;
}
public void setNumero(String numero) {
this.numero = numero;
}
//@NotEmpty
@Size(max = 50)
@Column(length = 50, nullable = false)
public String getComplemento() {
return complemento;
}
public void setComplemento(String complemento) {
this.complemento = complemento;
}
@NotEmpty
@Size(max = 30)
@Column(length = 30, nullable = false)
public String getBairro() {
return bairro;
}
public void setBairro(String bairro) {
this.bairro = bairro;
}
@NotEmpty
@Size(max = 30)
@Column(length = 30, nullable = false)
public String getCidade() {
return cidade;
}
public void setCidade(String cidade) {
this.cidade = cidade;
}
@NotEmpty
@Size(max = 2)
@Column(length = 2, nullable = false)
public String getEstado() {
return estado;
}
public void setEstado(String estado) {
this.estado = estado;
}
@NotEmpty
@Size(max = 9)
@Column(length = 9, nullable = false)
public String getCep() {
return cep;
}
public void setCep(String cep) {
this.cep = cep;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Pessoa other = (Pessoa) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
employee class
package br.com.model;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty;
import br.com.util.DecimalPositivo;
@Entity
@Table(name = "funcionario")
public class Funcionario implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Pessoa pessoa;
private String cpf;
private String cargo;
private BigDecimal salario;
private TipoSexo sexo;
private Date dataAdmissao;
private Date dataDemissao;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@NotNull
@OneToOne
@JoinColumn(name="pessoa_id")
public Pessoa getPessoa() {
return pessoa;
}
public void setPessoa(Pessoa pessoa) {
this.pessoa = pessoa;
}
@NotEmpty
@Size(max = 14)
@Column(length = 14, nullable = false)
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
@NotEmpty
@Size(max = 80)
@Column(length = 80, nullable = false)
public String getCargo() {
return cargo;
}
public void setCargo(String cargo) {
this.cargo = cargo;
}
//@NotNull
//@DecimalMin("0")
@DecimalPositivo
@Column(precision = 10, scale = 2, nullable = false)
public BigDecimal getSalario() {
return salario;
}
public void setSalario(BigDecimal salario) {
this.salario = salario;
}
@NotNull
@Enumerated(EnumType.STRING)
@Column(nullable = false)
public TipoSexo getSexo() {
return sexo;
}
public void setSexo(TipoSexo sexo) {
this.sexo = sexo;
}
@NotNull
@Temporal(TemporalType.DATE)
@Column(name = "data_admissao", nullable = false)
public Date getDataAdmissao() {
return dataAdmissao;
}
public void setDataAdmissao(Date dataAdmissao) {
this.dataAdmissao = dataAdmissao;
}
@Temporal(TemporalType.DATE)
@Column(name = "data_Demissao", nullable = true)
public Date getDataDemissao() {
return dataDemissao;
}
public void setDataDemissao(Date dataDemissao) {
this.dataDemissao = dataDemissao;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Funcionario other = (Funcionario) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
class EmployeeBancoBean
package br.com.model;
import java.io.Serializable;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.inject.Inject;
import javax.inject.Named;
import br.com.controller.CadastroFuncionarios;
import br.com.controller.CadastroPessoas;
import br.com.controller.NegocioException;
import br.com.repository.Funcionarios;
import br.com.repository.Pessoas;
@Named
@javax.faces.view.ViewScoped
public class CadastroFuncionarioBean implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private CadastroFuncionarios cadastrofuncionario;
@Inject
private CadastroPessoas cadastropessoa;
@Inject
private Pessoas pessoas;
@Inject
private Funcionarios funcionarios;
private Funcionario funcionario;
private Pessoa pessoa;
private List<Pessoa> todasPessoas;
private List<Funcionario> todosFuncionarios;
public void prepararCadastro() {
this.todasPessoas = this.pessoas.todas();
if (this.pessoa == null) {
this.pessoa = new Pessoa();
}
this.todosFuncionarios = this.funcionarios.todos();
if (this.funcionario == null) {
this.funcionario = new Funcionario();
}
}
public void dataAdmissaoAlterada(AjaxBehaviorEvent event) {
if (this.funcionario.getDataAdmissao() == null) {
this.funcionario.setDataDemissao(this.funcionario.getDataAdmissao());
}
}
public void salvar() {
FacesContext context = FacesContext.getCurrentInstance();
try {
pessoa = this.cadastropessoa.salvar(this.pessoa);
this.funcionario.setPessoa(pessoa);
this.pessoa = new Pessoa();
this.cadastrofuncionario.salvar(this.funcionario);
this.funcionario = new Funcionario();
context.addMessage(null, new FacesMessage("Funcionario salvo com sucesso!"));
} catch (NegocioException e) {
FacesMessage mensagem = new FacesMessage(e.getMessage());
mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
context.addMessage(null, mensagem);
}
}
public List<String> pesquisarCargos(String cargos) {
return this.funcionarios.cargosQueContem(cargos);
}
public List<String> pesquisarCpfs(String cpfs) {
return this.funcionarios.cpfsQueContem(cpfs);
}
public List<String> pesquisarNomes(String nomes) {
return this.pessoas.nomesQueContem(nomes);
}
public List<String> pesquisarEnderecos(String enderecos) {
return this.pessoas.enderecosQueContem(enderecos);
}
public List<String> pesquisarNumeros(String numeros) {
return this.pessoas.numerosQueContem(numeros);
}
public List<String> pesquisarComplementos(String complementos) {
return this.pessoas.complementosQueContem(complementos);
}
public List<String> pesquisarBairros(String bairros) {
return this.pessoas.bairrosQueContem(bairros);
}
public List<String> pesquisarCidades(String cidades) {
return this.pessoas.cidadesQueContem(cidades);
}
public List<String> pesquisarEstados(String estados) {
return this.pessoas.estadosQueContem(estados);
}
public List<String> pesquisarCeps(String ceps) {
return this.pessoas.cepsQueContem(ceps);
}
public List<Pessoa> getTodasPessoas() {
return this.todasPessoas;
}
public List<Funcionario> getTodosFuncionarios() {
return this.todosFuncionarios;
}
public TipoSexo[] getTiposFuncionarios() {
return TipoSexo.values();
}
public Funcionario getFuncionario() {
return funcionario;
}
public void setFuncionario(Funcionario funcionario) {
this.funcionario = funcionario;
}
public Pessoa getPessoa() {
return pessoa;
}
public void setPessoa(Pessoa pessoa) {
this.pessoa = pessoa;
}
}
Class InquiryBean
package br.com.amarildo.model;
import java.io.Serializable;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import br.com.amarildo.controller.CadastroFuncionarios;
import br.com.amarildo.controller.CadastroPessoas;
import br.com.amarildo.controller.NegocioException;
import br.com.amarildo.repository.Funcionarios;
import br.com.amarildo.repository.Pessoas;
@Named
@javax.faces.view.ViewScoped
public class ConsultaFuncionariosBean implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private Funcionarios funcionariosRepository;
@Inject
private Pessoas pessoasRepository;
@Inject
private CadastroFuncionarios cadastrofuncionario;
@Inject
private CadastroPessoas cadastropessoa;
private List<Pessoa> pessoas;
private Pessoa pessoaSelecionado;
private List<Funcionario> funcionarios;
private Funcionario funcionarioSelecionado;
public void excluir() {
FacesContext context = FacesContext.getCurrentInstance();
try {
this.cadastrofuncionario.excluir(this.funcionarioSelecionado);
this.cadastropessoa.excluir(this.pessoaSelecionado);
this.consultar();
context.addMessage(null, new FacesMessage("Funcionario excluído com sucesso!"));
} catch (NegocioException e) {
FacesMessage mensagem = new FacesMessage(e.getMessage());
mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
context.addMessage(null, mensagem);
}
}
public void consultar() {
this.funcionarios = funcionariosRepository.todos();
this.pessoas = pessoasRepository.todas();
}
public List<Pessoa> getPessoas() {
return pessoas;
}
public Pessoa getPessoaSelecionado() {
return pessoaSelecionado;
}
public void setPessoaSelecionado(Pessoa pessoaSelecionado) {
this.pessoaSelecionado = pessoaSelecionado;
}
public List<Funcionario> getFuncionarios() {
return funcionarios;
}
public Funcionario getFuncionarioSelecionado() {
return funcionarioSelecionado;
}
public void setFuncionarioSelecionado(Funcionario funcionarioSelecionado) {
this.funcionarioSelecionado = funcionarioSelecionado;
}
}
Well, if someone knows how to help me, I'll be very grateful.