Boa tarde, estou tendo um erro chato, já fiz curso de debug e vi que realmente está re retornando null, porém queria saber o porque e uma solução se possivel, aqui é apenas uma demostração, mais o projeto que estou tendo erro é outro. Mais o caso é o mesmo! Vou colocar aqui por parte pra depois explicar. Aqui está o meu 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">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<ui:composition template="/template/template.xhtml">
<ui:define name="conteudo">
<div class="ui-fluid">
<h:form id="formularioCliente">
<p:growl id="mensagem" showDetail="true" sticky="true" />
<p:fieldset legend="Cliente">
<h:panelGrid columns="2">
<p:outputLabel value="Nome: " for="nome" />
<p:inputText id="nome" placeholder="Nome Completo" size="40"
value="#{clienteBean.cliente.nome}" />
<p:outputLabel value="Sexo: " for="sexo" />
<p:selectOneRadio id="sexo" value="#{clienteBean.cliente.sexo}">
<f:selectItem itemLabel="Masculino" itemValue="Masculino" />
<f:selectItem itemLabel="Feminina" itemValue="Feminina" />
</p:selectOneRadio>
</h:panelGrid>
<h:panelGrid columns="2" id="painelCliente">
<p:outputLabel value="Pessoa: " for="pessoa" />
<p:selectOneMenu id="pessoa"
value="#{clienteBean.cliente.tipoPessoa}">
<f:selectItem itemValue="" itemLabel="Selecione..." />
<f:selectItem itemValue="Fisíca" itemLabel="Fisíca" />
<f:selectItem itemValue="Juridíca" itemLabel="Juridíca" />
<p:ajax event="change" update="painelCliente" />
</p:selectOneMenu>
<p:outputLabel value="CPF: " for="cpf"
rendered="#{clienteBean.cliente.tipoPessoa == 'Fisíca'}" />
<p:inputMask mask="999.999.999-99" id="cpf"
rendered="#{clienteBean.cliente.tipoPessoa == 'Fisíca'}"
value="#{clienteBean.cliente.cpf}" />
<p:outputLabel value="CNPJ: " for="cnpj"
rendered="#{clienteBean.cliente.tipoPessoa == 'Juridíca'}" />
<p:inputMask mask="99.999.999/9999-99" id="cnpj"
rendered="#{clienteBean.cliente.tipoPessoa == 'Juridíca'}"
value="#{clienteBean.cliente.cnpj}" />
</h:panelGrid>
<h:panelGrid columns="2">
<p:outputLabel value="Observação: " for="observacao" />
<p:inputTextarea id="observacao"
value="#{clienteBean.cliente.observacao}" rows="4"
placeholder="Observação cliente" />
</h:panelGrid>
<h:panelGrid columns="2">
<p:outputLabel value="Cidade: " for="cidade" />
<p:inputText id="cidade"
value="#{clienteBean.cliente.endereco.cidade}" size="20" />
<p:outputLabel value="Bairro: " for="bairro" />
<p:inputText id="bairro"
value="#{clienteBean.cliente.endereco.bairro}" />
<p:outputLabel value="Numero Casa: " for="numero" />
<p:inputText id="numero"
value="#{clienteBean.cliente.endereco.numeroCasa}" />
</h:panelGrid>
</p:fieldset>
<h:panelGrid columns="3">
<p:commandButton value="Salvar"
actionListener="#{clienteBean.salvar}" />
</h:panelGrid>
</h:form>
</div>
</ui:define>
</ui:composition>
</html>
Depois o meu bean.
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import br.com.bercalini.anotacoes.Transacao;
import br.com.bercalini.dao.ClienteDao;
import br.com.bercalini.dao.EnderecoDao;
import br.com.bercalini.jpautil.Cliente;
import br.com.bercalini.jpautil.Endereco;
import br.com.bercalini.util.MensagemUtil;
@SuppressWarnings("serial")
@Named
@SessionScoped
public class ClienteBean implements Serializable {
@Inject
private Cliente cliente;
@Inject
private Endereco endereco;
@Inject
private ClienteDao clienteDao;
@Inject
private EnderecoDao enderecoDao;
@Inject
private MensagemUtil mensagem;
@Transacao
public void salvar() {
if (cliente.getCodigo() == null) {
clienteDao.salvar(cliente);
Endereco buscarPorCodigo = enderecoDao.buscarPorCodigo(cliente.getEndereco().getCodigo());
cliente.setEndereco(buscarPorCodigo);
enderecoDao.salvar(endereco);
mensagem.mensagem("Cliente adicionado com sucesso");
} else {
}
this.cliente = new Cliente();
this.endereco = new Endereco();
}
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
public Endereco getEndereco() {
return endereco;
}
public void setEndereco(Endereco endereco) {
this.endereco = endereco;
}
}
Depois meus Daos.
import java.io.Serializable;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import br.com.bercalini.jpautil.Cliente;
@SuppressWarnings("serial")
public class ClienteDao implements Serializable{
@Inject
EntityManager manager;
public void salvar(Cliente cliente) {
manager.persist(cliente);
}
public Cliente buscarPorId(Long codigo) {
Cliente cliente = manager.find(Cliente.class, codigo);
return cliente;
}
}
@SuppressWarnings("serial")
public class EnderecoDao implements Serializable{
@Inject
EntityManager manager;
public Endereco buscarPorCodigo(Long codigo) {
Endereco endereco = manager.find(Endereco.class, codigo);
return endereco;
}
public void salvar(Endereco endereco) {
manager.persist(endereco);
}
}
Logo em seguida as minha entidades.
@Entity
@SuppressWarnings("serial")
public class Cliente implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long codigo;
private String nome;
private String sexo;
private String observacao;
private String tipoPessoa;
private String cpf;
private String cnpj;
@OneToOne
@JoinColumn(name = "endereco_codigo")
private Endereco endereco = new Endereco();
public Long getCodigo() {
return codigo;
}
public void setCodigo(Long codigo) {
this.codigo = codigo;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getSexo() {
return sexo;
}
public void setSexo(String sexo) {
this.sexo = sexo;
}
public String getObservacao() {
return observacao;
}
public void setObservacao(String observacao) {
this.observacao = observacao;
}
public String getTipoPessoa() {
return tipoPessoa;
}
public void setTipoPessoa(String tipoPessoa) {
this.tipoPessoa = tipoPessoa;
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public String getCnpj() {
return cnpj;
}
public void setCnpj(String cnpj) {
this.cnpj = cnpj;
}
public Endereco getEndereco() {
return endereco;
}
public void setEndereco(Endereco endereco) {
this.endereco = endereco;
}
}
@Entity
@SuppressWarnings("serial")
public class Cliente implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long codigo;
private String nome;
private String sexo;
private String observacao;
private String tipoPessoa;
private String cpf;
private String cnpj;
@OneToOne
@JoinColumn(name = "endereco_codigo")
private Endereco endereco = new Endereco();
public Long getCodigo() {
return codigo;
}
public void setCodigo(Long codigo) {
this.codigo = codigo;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getSexo() {
return sexo;
}
public void setSexo(String sexo) {
this.sexo = sexo;
}
public String getObservacao() {
return observacao;
}
public void setObservacao(String observacao) {
this.observacao = observacao;
}
public String getTipoPessoa() {
return tipoPessoa;
}
public void setTipoPessoa(String tipoPessoa) {
this.tipoPessoa = tipoPessoa;
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public String getCnpj() {
return cnpj;
}
public void setCnpj(String cnpj) {
this.cnpj = cnpj;
}
public Endereco getEndereco() {
return endereco;
}
public void setEndereco(Endereco endereco) {
this.endereco = endereco;
}
}
Ok o meu problema está no meu bean, quando clico em salvar quando faço o meu buscaPorCodigo, não to entendo porque está me retornando null, não é tempo de execução? não teria que gravar o meu cliente e depois buscar o meu endereco e setar no metodo set? então porque está vindo nullo? Sei que uma solução para isso é tirar o metodo buscarPorCodigo e setar mesmo sem o codigo.
cliente.setEndereco(endereco);
Mais ai perco o controle, alguém me da uma solução para este caso?