7
respostas

Erro pertinente com atributo null

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?

7 respostas

Fala aí Alisson,

Cara não entendi no seu código, onde está sendo feito o binding com clienteBean.cliente.endereco.codigo na sua view?

Se não esta sendo feito o binding creio que o código do endereço retornado nesse trecho: cliente.getEndereco().getCodigo() seja nulo.

Fernando muito boa a observação, esse binding geralmente é feitor no selectOneMenu? Como seria a ligação no meu exemplo?

Fernando e tenho uma outra duvida também que por menos que seja boba sempre fico assim de perguntar aqui no forum, está vendo o minha paginha xhtml? tenho cliente e endereco né? na hora de fazer o biding com o endereco, qual a maneira correta?

 <p:outputLabel value="Cidade: " for="cidade" />
                        <p:inputText id="cidade"
                            value="#{clienteBean.cliente.endereco.cidade}" size="20" />

Assim o meu endereco não salva.

 <p:outputLabel value="Cidade: " for="cidade" />
                        <p:inputText id="cidade"
                            value="#{clienteBean.endereco.cidade}" size="20" />

Assim ele salva, aqui estamos programandos oo correto? o primeiro de cima é o correto né? porem não salva nada no meu banco de dados.

Alisson tem um exemplo do selectOneMenu que você estava usando? Com base nele posso tentar adaptar para a sua nova página.

Sobre a segunda dúvida, as duas abordagens estão corretas porém para casos diferentes.

A primeira abordagem usando a seguinte EL e #{clienteBean.cliente.endereco.cidade}os dados que você fez essebinding` serão colocados diretamente no seu objeto cliente. Ou seja o endereço do cliente vai ser preenchido com os dados que foi preenchido no formulário.

A segunda abordagem usando a seguinte EL #{clienteBean.endereco.cidade} você terá um objeto endereço preenchido no seu bean. E a partir desse objeto você pode "setar" em qualquer outro objeto. Como por exemplo "setar" na propriedade endereço do seu objeto cliente.

A segunda abordagem vejo que pode ser usada quando você tem que fazer algum tipo de manipulação com o objeto antes de passa-lo ao modelo.

Agora se sua necessidade é simplesmente preencher os dados do cliente com os dados que vieram direto do formulário, a primeira abordagem é mais direta. (E eu particularmente prefiro essa abordagem mais direta.)

Fernando perfeito, quando chegar em casa passo o meu selectOneMenu, e muito obrigado novamente, por ter paciência kkk, minhas duvidas são de novatos, porem não faz nem um ano que estudo java por isso tenho mil e umas duvidas e milhares de erros :( peço desculpa por isso! e sim eu queria usar a primeira abordagem, mais não consigo salvar no meu banco de dados, alias até salva só que vem com valor todos nullos. :(

De nada Alisson, e relaxa cara eu acho melhor perguntar do que fazer errado ou pior aprender errado. Sempre que você precisar é só mandar as dúvidas que vamos tentando te ajudar. =)

Sobre salvar com valores nulos, creio que isso esteja ocorre porquê você precisa primeiro salvar o objeto Cliente e depois salvar o objeto Endereço. Se você salvar só o Cliente por padrão não salva o Endereço.

Ou o que você pode fazer é mudar o comportamento das FK de relacionamento. Fazendo um cascade para persistência.

Na sua anotação de relacionamento @OneToOne você pode passar a propriedade chamada cascade, essa propriedade como o próprio nome diz fará uma cascata para o relacionamento. Você só precisa definir qual o tipo de cascata que você quer fazer PERSIST(cascata ao salvar), MERGE(cascata ao alterar) ou REMOVE(cascata ao excluir). Essa propriedade recebe um array você pode passar um ou mais tipos.

Supondo que você coloque PERSIST ao salvar um objeto Cliente que tenha um objeto Endereço ambos serão salvos. Sem precisar fazer em duas partes.

Para o MERGE quando é efetuado uma alteração em um cliente o endereço também é alterado.

Para o REMOVE quando é removido um cliente o endereço também é removido.

Opa Fernando beleza? cara muito obrigado pela suas dicas, usei cascade no meu caso e resolveu, mais não so muito a favor de usar cascade, lembra que falei que teria outro projeto que tava dando o mesmo erro? pois então. Vamos dar um exemplo, tenho minha classe de itens correto? nela vou ter uma fk de produto e uma de fk de venda correto? fiz a minha paginá vendaBean e venda.xhtml e quando quero gravar uma venda ela salva, mais quando vo salvar os itens dessa venda ai que vem o erro nullo. Irei postar aqui.

@Entity
@SuppressWarnings("serial")
public class Item implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private Integer quantidade;
    private BigDecimal valorParcial = BigDecimal.valueOf(0.0D);
    @ManyToOne
    @JoinColumn(name = "produto_codigo")
    private Produto produto = new Produto();
    @ManyToOne
    @JoinColumn(name = "venda_codigo")
    private Venda venda = new Venda();

    public Long getCodigo() {
        return codigo;
    }
    public void setCodigo(Long codigo) {
        this.codigo = codigo;
    }

    public Produto getProduto() {
        return produto;
    }
    public void setProduto(Produto produto) {
        this.produto = produto;
    }
    public Venda getVenda() {
        return venda;
    }
    public void setVenda(Venda venda) {
        this.venda = venda;
    }
    public Integer getQuantidade() {
        return quantidade;
    }
    public void setQuantidade(Integer quantidade) {
        this.quantidade = quantidade;
    }
    public BigDecimal getValorParcial() {
        return valorParcial;
    }
    public void setValorParcial(BigDecimal valorParcial) {
        this.valorParcial = valorParcial;
    }



}
@Entity
@SuppressWarnings("serial")
@NamedQueries({
    @NamedQuery(name = "Produto.Fornecedores", query = "Select f from Fornecedor f"),
    @NamedQuery(name = "Produto.lista", query = "Select p from Produto p join fetch p.fornecedor")
})
public class Produto implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private String nome;
    private BigDecimal preco = BigDecimal.valueOf(0.0D);
    private Integer quantidade;
    @ManyToOne
    @JoinColumn(name = "fornecedor_codigo")
    private Fornecedor fornecedor = new Fornecedor();


    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 BigDecimal getPreco() {
        return preco;
    }
    public void setPreco(BigDecimal preco) {
        this.preco = preco;
    }
    public Integer getQuantidade() {
        return quantidade;
    }
    public void setQuantidade(Integer quantidade) {
        this.quantidade = quantidade;
    }
    public Fornecedor getFornecedor() {
        return fornecedor;
    }
    public void setFornecedor(Fornecedor fornecedor) {
        this.fornecedor = fornecedor;
    }



}

@Entity
@SuppressWarnings("serial")
public class Venda implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    @Temporal(TemporalType.TIMESTAMP)
    private Calendar horario = Calendar.getInstance();
    private BigDecimal valorTotal = BigDecimal.valueOf(0.0D);
    @ManyToOne
    @JoinColumn(name = "funcionario_codigo")
    private Funcionario funcionario = new Funcionario();
    @OneToMany(mappedBy = "venda")
    private List<Item> itens = new ArrayList<Item>();

    public Long getCodigo() {
        return codigo;
    }
    public void setCodigo(Long codigo) {
        this.codigo = codigo;
    }
    public Calendar getHorario() {
        return horario;
    }
    public void setHorario(Calendar horario) {
        this.horario = horario;
    }

    public BigDecimal getValorTotal() {
        return valorTotal;
    }
    public void setValorTotal(BigDecimal valorTotal) {
        this.valorTotal = valorTotal;
    }
    public Funcionario getFuncionario() {
        return funcionario;
    }
    public void setFuncionario(Funcionario funcionario) {
        this.funcionario = funcionario;
    }
    public List<Item> getItens() {
        return itens;
    }
    public void setItens(List<Item> itens) {
        this.itens = itens;
    }
}

Meu venda bean

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.bercalini.anotacoes.Transacao;
import br.com.bercalini.dao.FuncionarioDao;
import br.com.bercalini.dao.ItemDao;
import br.com.bercalini.dao.ProdutoDao;
import br.com.bercalini.dao.VendaDao;
import br.com.bercalini.modelo.Funcionario;
import br.com.bercalini.modelo.Item;
import br.com.bercalini.modelo.Produto;
import br.com.bercalini.modelo.Venda;

@Named
@ViewScoped
@SuppressWarnings("serial")
public class VendaBean implements Serializable {

    @Inject
    Produto produto;
    @Inject
    private Item item;
    @Inject
    private ItemDao itemDao;
    @Inject
    private VendaDao vendaDao;
    @Inject
    private Venda venda;
    @Inject
    private ProdutoDao produtoDao;
    @Inject
    private FuncionarioDao funcionarioDao;
    private List<Item> itens = new ArrayList<Item>();

    @Transacao
    public List<Produto> getListaProdutos() {
        return produtoDao.produtos();
    }

    @Transacao
    public void salvar() {
        if(venda.getCodigo() == null) {
            Funcionario buscarPorId = funcionarioDao.buscarPorId(venda.getFuncionario().getCodigo());
            venda.setFuncionario(buscarPorId);
            vendaDao.salvar(venda);
            Produto buscarPorId2 = produtoDao.buscarPorId(item.getProduto().getCodigo());
            item.setProduto(buscarPorId2);
            itemDao.salvar(item);

        } else {

        }
        this.venda = new Venda();
        this.itens = new ArrayList<Item>();
    }

    public void adicionarProduto(Produto produto) {
        int posicaoEncontrada = -1;
        for(int pos = 0; pos < itens.size() && posicaoEncontrada < 0; pos ++) {
            Item itemTemporario = itens.get(pos);
            if(itemTemporario.getProduto().equals(produto)) {
                posicaoEncontrada = pos;
            }
        }
        Item item = new Item();
        item.setProduto(produto);
        if(posicaoEncontrada < 0) {
            item.setQuantidade(1);
            item.setValorParcial(produto.getPreco());
            itens.add(item);
        } else {
            Item itemTemp = itens.get(posicaoEncontrada);
            item.setQuantidade(itemTemp.getQuantidade() + 1);
            item.setValorParcial(produto.getPreco().multiply(new BigDecimal(item.getQuantidade())));
            itens.set(posicaoEncontrada, item);
        }
        venda.setValorTotal(venda.getValorTotal().add(produto.getPreco()));
    }

    public void remover(Item item) {
        int posicaoEncontrada = -1;
        for (int posicao = 0; posicao < itens.size() && posicaoEncontrada < 0; posicao++) {
            Item temporario = itens.get(posicao);
            if (temporario.getProduto().getCodigo()
                    .equals(item.getProduto().getCodigo())) {
                posicaoEncontrada = posicao;
            }
        }
        if (posicaoEncontrada > -1) {
            itens.remove(posicaoEncontrada);
            venda.setValorTotal(venda.getValorTotal().subtract(
                    item.getValorParcial()));
        }
    }

    public void carregarDadosVenda() {
        venda.setHorario(venda.getHorario());
        Funcionario funcionario = funcionarioDao.buscarPorId(1L);
        venda.setFuncionario(funcionario);
        venda.setValorTotal(venda.getValorTotal());
    }

    public Venda getVenda() {
        return venda;
    }

    public void setVenda(Venda venda) {
        this.venda = venda;
    }

    public List<Item> getItens() {
        return itens;
    }

    public void setItens(List<Item> itens) {
        this.itens = itens;
    }

    public Item getItem() {
        return item;
    }

    public void setItem(Item item) {
        this.item = item;
    }

}

meu venda 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="formularioVenda">
                <p:dataTable id="tabelaVenda" paginator="true" rows="3"
                    emptyMessage="Nenhum produto encontrado" var="produto"
                    value="#{vendaBean.listaProdutos}">

                    <f:facet name="header">
                    Tabela de produtos
                </f:facet>

                    <p:column headerText="Produto">
                        <h:outputText value="#{produto.nome}" />
                    </p:column>

                    <p:column headerText="Preço">
                        <h:outputText value="#{produto.preco}" />
                    </p:column>

                    <p:column headerText="Quantidade">
                        <h:outputText value="#{produto.quantidade}" />
                    </p:column>

                    <p:column headerText="Fornecedor">
                        <h:outputText value="#{produto.fornecedor.nome}" />
                    </p:column>

                    <p:column headerText="Adicionar Item">
                        <p:commandButton value="Adicionar"
                            actionListener="#{vendaBean.adicionarProduto(produto)}"
                            update=":formularioVenda:tblItens :formularioVenda:painelVenda" />
                    </p:column>

                </p:dataTable>

                <p:separator />


                <p:dataTable id="tblItens" paginator="true" rows="3"
                    emptyMessage="Nenhum item encontrado" var="item"
                    value="#{vendaBean.itens}">

                    <p:column headerText="Produto">
                        <h:outputText value="#{item.produto.nome}" />
                    </p:column>

                    <p:column headerText="Quantidade">
                        <h:outputText value="#{item.quantidade}" />
                    </p:column>

                    <p:column headerText="Valor Parcial">
                        <h:outputText value="#{item.valorParcial}" />
                    </p:column>

                    <p:column headerText="Fornecedor">
                        <h:outputText value="#{item.produto.fornecedor.nome}" />
                    </p:column>

                    <p:column headerText="Remover Item">
                        <p:commandButton value="Remover"
                            actionListener="#{vendaBean.remover(item)}"
                            update=":formularioVenda:tblItens :formularioVenda:painelVenda" />
                    </p:column>

                </p:dataTable>

                <h:panelGrid columns="3" id="painelVenda">

                    <p:outputLabel value="Valor total: " for="valor" />
                    <p:inputText id="valor" value="#{vendaBean.venda.valorTotal}"
                        readonly="true" size="11" />

                    <p:commandButton value="Finalizar venda"
                        actionListener="#{vendaBean.carregarDadosVenda}"
                        oncomplete="PF('finalizar').show();"
                        update=":formularioVenda :dialog" />

                </h:panelGrid>
            </h:form>

            <p:dialog id="dialog" appendTo="@(body)" header="Finalizar venda"
                closable="true" modal="true" resizable="false" draggable="false"
                widgetVar="finalizar">
                <h:form>
                    <h:panelGrid columns="2">
                        <p:outputLabel value="Data: " />
                        <p:inputText readonly="true"
                            value="#{vendaBean.venda.horario.time}">
                            <f:convertDateTime pattern="dd/MM/yyyy"
                                timeZone="America/Sao_Paulo" />
                        </p:inputText>

                        <p:outputLabel value="Funcionario: " />
                        <p:inputText readonly="true"
                            value="#{vendaBean.venda.funcionario.nome}" />

                        <p:outputLabel value="Valor total: " />
                        <p:inputText readonly="true" value="#{vendaBean.venda.valorTotal}" />
                        <p:commandButton value="Finalizar"
                            actionListener="#{vendaBean.salvar}" update="formularioVenda"
                            onclick="PF('finalizar').hide();" />
                        <p:commandButton value="Voltar" onclick="PF('finalizar').hide();" />
                    </h:panelGrid>

                </h:form>


            </p:dialog>
        </div>

    </ui:define>
</ui:composition>

</html>

e o meu produto.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="formularioProduto">
                <p:growl id="mensagem" showDetail="true" sticky="true" />
                <p:fieldset legend="Produto">

                    <h:panelGrid columns="2">

                        <p:outputLabel value="Nome: " for="nome" />
                        <p:inputText id="nome" value="#{produtoBean.produto.nome}"
                            size="30" placeholder="Descrição do produto" />

                    </h:panelGrid>

                    <h:panelGrid columns="2">

                        <p:outputLabel value="Preço: " for="preco" />
                        <p:inputText id="preco" value="#{produtoBean.produto.preco}" />

                        <p:outputLabel value="Quantidade: " for="quantidade" />
                        <p:inputText id="quantidade"
                            value="#{produtoBean.produto.quantidade}" />

                        <p:outputLabel value="Fornecedor: " for="fornecedor" />
                        <p:selectOneMenu id="fornecedor"
                            value="#{produtoBean.produto.fornecedor}" filter="true"
                            filterMatchMode="cotains" converter="fornecedorConverter">
                            <f:selectItem itemValue="" itemLabel="Selecione um fornecedor" />
                            <f:selectItems value="#{produtoBean.fornecedores}" var="forne"
                                itemValue="#{forne}" itemLabel="#{forne.nome}" />
                        </p:selectOneMenu>

                    </h:panelGrid>

                </p:fieldset>

                <h:panelGrid columns="5">
                    <p:commandButton value="Salvar"
                        actionListener="#{produtoBean.salvar}" update="formularioProduto" />

                    <p:commandButton value="Buscar"
                        action="#{produtoBean.formularioTabela}" immediate="true" />

                    <p:commandButton value="Limpar" type="reset" />
                </h:panelGrid>

            </h:form>

        </div>

    </ui:define>
</ui:composition>

</html>

Quando coloco o meu buscaPorId do meu produtoDao na hora de salvar o item me retorna null, mais se tento apenas setar ele pelo item.setProduto(produto) me da erro de objto transient. Do jeito que está ai o retorno do erro é este.

jan 31, 2017 10:23:24 AM com.sun.faces.lifecycle.InvokeApplicationPhase execute
ADVERTÊNCIA: java.lang.IllegalArgumentException: id to load is required for loading
javax.el.ELException: java.lang.IllegalArgumentException: id to load is required for loading
    at org.apache.el.parser.AstValue.invoke(AstValue.java:260)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:149)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:814)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:509)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1104)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: id to load is required for loading
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:87)
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:59)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2421)
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:974)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:807)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:781)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.bean.proxy.AbstractBeanInstance.invoke(AbstractBeanInstance.java:38)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100)
    at org.jboss.weldx.persistence.EntityManager$196817612$Proxy$_$$_WeldClientProxy.find(Unknown Source)
    at br.com.bercalini.dao.ProdutoDao.buscarPorId(ProdutoDao.java:41)
    at br.com.bercalini.bean.VendaBean.salvar(VendaBean.java:54)
    at br.com.bercalini.bean.VendaBean$Proxy$_$$_WeldSubclass.salvar$$super(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.interceptor.proxy.TerminalAroundInvokeInvocationContext.proceedInternal(TerminalAroundInvokeInvocationContext.java:49)
    at org.jboss.weld.interceptor.proxy.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:77)
    at br.com.bercalini.gerenciamento.Gerenciamento.gerenciarTransacoes(Gerenciamento.java:24)
    at sun.reflect.GeneratedMethodAccessor195.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:74)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeAroundInvoke(InterceptorMethodHandler.java:84)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:72)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:56)
    at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:79)
    at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:68)
    at br.com.bercalini.bean.VendaBean$Proxy$_$$_WeldSubclass.salvar(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
    ... 34 more

jan 31, 2017 10:23:24 AM com.sun.faces.context.AjaxExceptionHandlerImpl handlePartialResponseError
GRAVE: java.lang.IllegalArgumentException: id to load is required for loading
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:87)
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:59)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2421)
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:974)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:807)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:781)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.bean.proxy.AbstractBeanInstance.invoke(AbstractBeanInstance.java:38)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100)
    at org.jboss.weldx.persistence.EntityManager$196817612$Proxy$_$$_WeldClientProxy.find(Unknown Source)
    at br.com.bercalini.dao.ProdutoDao.buscarPorId(ProdutoDao.java:41)
    at br.com.bercalini.bean.VendaBean.salvar(VendaBean.java:54)
    at br.com.bercalini.bean.VendaBean$Proxy$_$$_WeldSubclass.salvar$$super(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.interceptor.proxy.TerminalAroundInvokeInvocationContext.proceedInternal(TerminalAroundInvokeInvocationContext.java:49)
    at org.jboss.weld.interceptor.proxy.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:77)
    at br.com.bercalini.gerenciamento.Gerenciamento.gerenciarTransacoes(Gerenciamento.java:24)
    at sun.reflect.GeneratedMethodAccessor195.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:74)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeAroundInvoke(InterceptorMethodHandler.java:84)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:72)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:56)
    at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:79)
    at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:68)
    at br.com.bercalini.bean.VendaBean$Proxy$_$$_WeldSubclass.salvar(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:149)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:814)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:509)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1104)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

Desde já muito obrigado!