Duvidas jsf e Hibernate salvando como NULL

13 respostas
fred_cbranco

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!

13 Respostas

fred_cbranco

Alguem?

Hebert_Coelho
Tenta colocar:

@Id

@GeneratedValue(strategy = GenerationType.AUTO)

private Long id;
fred_cbranco
<blockquote><div class="quote-author">jakefrog:</div>Tenta colocar:

@Id

@GeneratedValue(strategy = GenerationType.AUTO)

private Long id;</blockquote>

coloquei e nada.
fred_cbranco

Ninguem pode me ajudar?

hugo.hlcxcx

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

fred_cbranco

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

Hebert_Coelho

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

fred_cbranco

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

altitdb

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.

luxu

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

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;

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>
fred_cbranco
luxu:
bom vamos lá, tenho a classe FUNCIONÁRIO:
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;

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>
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
Hebert_Coelho

Coloca teu value com #{vendaController.cliente}.

fred_cbranco

se coloco assim:

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

Nada acontece

Criado 10 de janeiro de 2012
Ultima resposta 11 de jan. de 2012
Respostas 13
Participantes 5