Duvidas jsf e Hibernate salvando como NULL

Galera vamos la pra ver se alguem consgue me tirar esta duvida cruel
tenho a entidade venda, que recebe 1 cliente o codigo dela esta assim

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Model;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import javax.persistence.Table;


/**
 *
 * @author Fred
 */
@Entity
@Table(name="venda")
public class Venda implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    private Double valor;
    
    @OneToOne
    private Cliente cliente;
    @OneToMany
    private List<Produto> produtos;

    public Venda(){

    }
    public Venda(Long id, Double valor, Cliente cliente, List<Produto> produtos){
        this.id = id;
        this.valor = valor;
        this.cliente = cliente;
        this.produtos = produtos;

    }

    /**
     * @return the id
     */
    public Long getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return the valor
     */
    public Double getValor() {
        return valor;
    }

    /**
     * @param valor the valor to set
     */
    public void setValor(Double valor) {
        this.valor = valor;
    }

    /**
     * @return the clientes
     */
    public Cliente getCliente() {
        return cliente;
    }

    /**
     * @param clientes the clientes to set
     */
    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    /**
     * @return the produtos
     */
    public List<Produto> getProdutos() {
        return produtos;
    }

    /**
     * @param produtos the produtos to set
     */
    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }


}

Ai fiz a interface DAO

public interface VendaDao {
    public void save(Venda venda);
    public Venda getVenda(long id);
    public List<Venda> list();
    public void remove(Venda venda);
    public void update(Venda venda);

}

Implementei em uma classe todos os metodos

public class VendaDaoImp implements VendaDao {

    public void save(Venda venda) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        
        session.save(venda);
        t.commit();
    }

    public Venda getVenda(long id) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        return (Venda) session.load(Venda.class, id);
    }

    public List<Venda> list() {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        List lista = session.createQuery("from Venda").list();
        t.commit();
        return lista;
    }

    public void remove(Venda venda) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        session.delete(venda);
        t.commit();
    }

    public void update(Venda venda) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        session.update(venda);
        t.commit();
    }

}

Fiz o controller assim

@ManagedBean
@SessionScoped
public class VendaController {
    private Venda venda;
    private Cliente cliente;
    private DataModel listaVendas;
    private ClienteVenda clienteVenda;

    public DataModel getListarVendas() {
        List<Venda> lista = new VendaDaoImp().list();
        listaVendas = new ListDataModel(lista);
        return listaVendas;
    }

    public Venda getVenda() {
         if(venda == null){
            return new Venda();
        } else {
             return venda;
        }
    }

    public void setVenda(Venda venda) {
        this.venda = venda;
    }
    public Cliente getCliente() {
         if(cliente == null){
            return new Cliente();
        } else {
             return cliente;
        }
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }
    public ClienteVenda getClienteVenda() {
         if(clienteVenda == null){
            return new ClienteVenda();
        } else {
             return clienteVenda;
        }
    }

    public void setClienteVenda(ClienteVenda clienteVenda) {
        this.clienteVenda = clienteVenda;
    }

    public void prepararAdicionarVenda(){

        venda = new Venda();
       
    }

    public void prepararAlterarVenda(){
        venda = (Venda)(listaVendas.getRowData());
    }

    public String excluirVenda(){

        Venda vendaTemp = (Venda)(listaVendas.getRowData());
        VendaDao dao = new VendaDaoImp();
        dao.remove(vendaTemp);
        return "index";

    }

    public void adicionarVenda(){
        
        VendaDao dao = new VendaDaoImp();
        System.out.println(venda.getCliente());
        dao.save(venda);

    }

    public void alterarVenda(){

        VendaDao dao = new VendaDaoImp();
        dao.update(venda);

    }


}

e o jsf fiz assim:

<h:form prependId="false">
                <h:panelGrid id="infosVenda" columns="2" style="margin-bottom:10px">

                   

                    <h:outputLabel for="cliente" value="Cliente:" />
                    
                    <h:selectOneMenu  value="#{vendaController.cliente.nome}">
                        <f:selectItems value="#{clienteController.listarClientes}"/>
                    </h:selectOneMenu>

                    <h:outputLabel for="produto" value="Produto:" />

                    <h:selectOneMenu  value="#{produtoController.produto.descricao}">
                        <f:selectItems value="#{produtoController.listarProdutos}"/>
                    </h:selectOneMenu>

            
                    <h:outputLabel for="valor" value="Valor:" />
                    <h:inputText id="valor" value="#{vendaController.venda.valor}"/>

                    

                    <p:commandButton update="tabela" oncomplete="dialogGerVenda.hide();" actionListener="#{vendaController.adicionarVenda}" value="Inserir Venda"/>
                    <p:commandButton update="tabela" oncomplete="dialogGerVenda.hide();" actionListener="#{vendaController.alterarVenda}" value="Alterar Livro"/>

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

Ok ao salva nao estou conseguindo pegar o id do cliente e salvar na entidade venda, ele esta salvando como NULL alguem sabe como resolver isso?
Muito Obrigado!

Alguem?

Tenta colocar:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

[quote=jakefrog]Tenta colocar:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;[/quote]
coloquei e nada.

Ninguem pode me ajudar?

Já pensou em criar um Converter para a sua entidade Cliente ?

Ola amigo eu nao sei como fazer, poderia me ajudar?

Ola amigo eu nao sei como fazer, poderia me ajudar?[/quote]
Não sei se Converter vai solucionar, mas aqui tem um tutorial: JSF: Converter e Bean Auto Complete

Ninguem ai com uma solução? parece estar tao simples!

Cara…

o correto seria você criar um Converter para montar o combo de Clientes…

No link a seguir explica como fazer converter e como utiliza-lo, e alem disso alguns problemas que acontecem quando esta utilizando eles.

http://altieresm.wordpress.com/2011/10/26/combos-aninhados-com-jsf2-e-primefaces/

Qualquer duvida na hora de criar só falar.

bom vamos lá, tenho a classe FUNCIONÁRIO:

[code]public class Funcionario implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id @GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="fun_codigo") 
private Integer codigo;

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="cid_codigo")
private Cidade cidade;[/code]

e tenho a classe CIDADE, ou seja, um funcionário mora numa cidade, na hora de salvar a cidade no funcionário faço assim, crio um objeto cidade, seto o id nele e depois salvo a cidade no funcionario, veja:

public void salvar(){ InterfaceDAO<Funcionario> funcionarioDAO = new HibernateDAO<Funcionario>(Funcionario.class, FacesContextUtil.getRequestSession()); // setar a cidade selecionada Cidade cidade = new Cidade(); cidade.setCodigo(this.getCid_Codigo()); this.funcionario.setCidade(cidade); funcionarioDAO.salvar(funcionario);

lembrando q no meu jsf tenho uma lista das cidades e pego seu id:

<p:fieldset legend="Cidade" style="font-size:12px;"> <h:selectOneMenu id="selectCidade" value="#{funcionarioBean.cid_Codigo}" title="Selecione uma cidade"> <f:selectItems value="#{entradaAlunosBBean.cidades}" /> </h:selectOneMenu> </p:fieldset>

[quote=luxu]bom vamos lá, tenho a classe FUNCIONÁRIO:

[code]public class Funcionario implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id @GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="fun_codigo") 
private Integer codigo;

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="cid_codigo")
private Cidade cidade;[/code]

e tenho a classe CIDADE, ou seja, um funcionário mora numa cidade, na hora de salvar a cidade no funcionário faço assim, crio um objeto cidade, seto o id nele e depois salvo a cidade no funcionario, veja:

public void salvar(){ InterfaceDAO<Funcionario> funcionarioDAO = new HibernateDAO<Funcionario>(Funcionario.class, FacesContextUtil.getRequestSession()); // setar a cidade selecionada Cidade cidade = new Cidade(); cidade.setCodigo(this.getCid_Codigo()); this.funcionario.setCidade(cidade); funcionarioDAO.salvar(funcionario);

lembrando q no meu jsf tenho uma lista das cidades e pego seu id:

<p:fieldset legend="Cidade" style="font-size:12px;"> <h:selectOneMenu id="selectCidade" value="#{funcionarioBean.cid_Codigo}" title="Selecione uma cidade"> <f:selectItems value="#{entradaAlunosBBean.cidades}" /> </h:selectOneMenu> </p:fieldset>
[/quote]
Em primeiro lugar muito obrigado pela ajuda!

Fiz conforme me passou!
no controller fiz o seguinte metodo!

 public void adicionarVenda(){
        
        VendaDao dao = new VendaDaoImp();
        Cliente c = new Cliente();
        c.setId(this.getCliente());
        this.venda.setCliente(cliente);
        System.out.println(venda.getCliente());
        dao.save(venda);

    }

O classe venda ta assim

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Model;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import javax.persistence.Table;


/**
 *
 * @author Fred
 */
@Entity
@Table(name="venda")
public class Venda implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private Double valor;
    
    @OneToOne
    private Cliente cliente;
    @OneToMany
    private List<Produto> produtos;

    public Venda(){

    }
    public Venda(Long id, Double valor, Cliente cliente, List<Produto> produtos){
        this.id = id;
        this.valor = valor;
        this.cliente = cliente;
        this.produtos = produtos;

    }

    /**
     * @return the id
     */
    public Long getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return the valor
     */
    public Double getValor() {
        return valor;
    }

    /**
     * @param valor the valor to set
     */
    public void setValor(Double valor) {
        this.valor = valor;
    }

    /**
     * @return the clientes
     */
    public Cliente getCliente() {
        return cliente;
    }

    /**
     * @param clientes the clientes to set
     */
    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    /**
     * @return the produtos
     */
    public List<Produto> getProdutos() {
        return produtos;
    }

    /**
     * @param produtos the produtos to set
     */
    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }


}

E a Cliente assim:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Model;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 *
 * @author Fred
 */
@Entity
@Table(name="cliente")
public class Cliente implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String nome;

    public Cliente(){

    }
    public Cliente(Long id, String nome){
        this.nome = nome;
        this.id = id;
    }

    /**
     * @return the id
     */
    public Long getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }
    @Override
     public String toString() {
        return nome;
    }

    public void setId(Cliente cliente) {
         this.id = id;
    }

}

No jsf esta assim:

  <h:outputLabel for="cliente" value="Cliente:" />
                    
                    <h:selectOneMenu  value="#{vendaController.cliente}">
                        <f:selectItems value="#{clienteController.listarClientes}"/>
                    </h:selectOneMenu>

ai que esta ao clicar em inserir nao acontece nada.
se eu coloco

<h:selectOneMenu  value="#{vendaController.cliente.nome}">

ai ele grava null no banco.
Oque esta errado?
Grato

Coloca teu value com #{vendaController.cliente}.

se coloco assim:

<h:outputLabel for="cliente" value="Cliente:" />  
                    
                  <h:selectOneMenu  value="#{vendaController.cliente}">  
                      <f:selectItems value="#{clienteController.listarClientes}"/>  
                  </h:selectOneMenu> 

Nada acontece