Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Duvida sobre projeto JSF&Hibernate

Pessoal, atualmente estou criando um projeto para colocar o aprendizado em prática juntamente aos cursos. Tenho um projeto de venda, onde eu posso realizar uma venda de produtos, em Venda eu tenho uma lista de Itens, onde tenho relacionado um produto a um item, e nesse item defino a quantidade de produtos, e o valor total para salvar no banco. E não quero repetir produtos, ou adicionar caso tenha estoque zero. Porem o método gravar só faz as verificações, ou melhor, só entra nos "Ifs" se esse item na lista não estiver gravado no banco. Abaixo está o código: obs: deixei comentado os métodos para fazer os testes...

package br.com.loja.bean;

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

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;

import br.com.loja.dao.ItemDAO;
import br.com.loja.dao.ProdutoDAO;
import br.com.loja.dao.VendaDAO;
import br.com.loja.modelo.Item;
import br.com.loja.modelo.Produto;
import br.com.loja.modelo.Venda;

@ManagedBean
@ViewScoped
public class VendaBean {

    private Venda venda = new Venda();
    private Item item = new Item();
    private Integer codBuscaProduto;

    public Integer getCodBuscaProduto() {
        return codBuscaProduto;
    }

    public void setCodBuscaProduto(Integer codBuscaProduto) {
        this.codBuscaProduto = codBuscaProduto;
    }

    public Venda getVenda() {
        return venda;
    }

    public Item getItem() {
        return item;
    }

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

    public void carregaAdiciona() {

        ProdutoDAO pDAO = new ProdutoDAO();
        this.item.setProduto(pDAO.buscarPodutoPorCodigo(codBuscaProduto));

        if (this.item.getProduto() == null) {
            System.out.println("O objeto está null");
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Produto não encontrado"));
            this.item = new Item();
        } else {

            if (this.venda.getListaDeProdutos().contains(this.item)) {
                System.out.println("Achou o produto na lista e entrou no IF");
                FacesContext.getCurrentInstance().addMessage(null,
                        new FacesMessage("O produto já está na lista"));
                this.item = new Item();
            } else {

                if (this.item.getProduto().getEmEstoque() == 0) {
                    System.out.println("O objeto tem estoque 0");
                    FacesContext.getCurrentInstance().addMessage(null,
                            new FacesMessage("Não há quantia suficiente deste produto em estoque"));
                    this.item = new Item();
                } else {

                    System.out.println("Adicionando o produto");
                    ItemDAO iDAO = new ItemDAO();
                    //iDAO.gravarItem(item);
                    this.venda.adicionaProduto(item);
                    this.item = new Item();
                }

            }
        }

    }

    public void removeItem(Item item) {
        this.venda.removeProduto(item);
        ItemDAO iDAO = new ItemDAO();
        //item = iDAO.buscaItem(item.getId());
        //iDAO.removerItem(item);
    }

    public void alteraItem(Item item) {
        ItemDAO iDAO = new ItemDAO();
        System.out.println(item.getProduto().toString());
        System.out.println(item.getQuantidade());
        item.setValorTotal(item.getQuantidade().multiply(item.getProduto().getValor()));
        System.out.println(item.getValorTotal());

        iDAO.alteraItem(item);

    }

    public void gravarVenda() {

        VendaDAO vDAO = new VendaDAO();
        vDAO.gravarVenda(this.venda);
        this.venda = new Venda();
    }

}

Modelagem: Venda:

package br.com.loja.modelo;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Venda {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private BigDecimal valor = new BigDecimal(0);

    @Temporal(TemporalType.TIMESTAMP)
    private Calendar data = Calendar.getInstance();

    @Enumerated(EnumType.STRING)
    private FormaPagamento formaPagamento;

    @ManyToMany
    private List<Item> listaDeProdutos = new ArrayList<Item>();

    public Integer getId() {
        return id;
    }

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

    public BigDecimal getValor() {
        return valor;
    }

    public void setValor(BigDecimal valor) {
        this.valor = valor;
    }

    public Calendar getData() {
        return data;
    }

    public void setData(Calendar data) {
        this.data = data;
    }

    public FormaPagamento getFormaPagamento() {
        return formaPagamento;
    }

    public void setFormaPagamento(FormaPagamento formaPagamento) {
        this.formaPagamento = formaPagamento;
    }

    public List<Item> getListaDeProdutos() {
        return listaDeProdutos;
    }

    public void setListaDeProdutos(List<Item> listaDeProdutos) {
        this.listaDeProdutos = listaDeProdutos;
    }

    public void adicionaProduto(Item item) {
        this.listaDeProdutos.add(item);

    }

    public void removeProduto(Item item) {
        this.listaDeProdutos.remove(item);
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((data == null) ? 0 : data.hashCode());
        result = prime * result + ((formaPagamento == null) ? 0 : formaPagamento.hashCode());
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime * result + ((listaDeProdutos == null) ? 0 : listaDeProdutos.hashCode());
        result = prime * result + ((valor == null) ? 0 : valor.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;
        Venda other = (Venda) obj;
        if (data == null) {
            if (other.data != null)
                return false;
        } else if (!data.equals(other.data))
            return false;
        if (formaPagamento != other.formaPagamento)
            return false;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        if (listaDeProdutos == null) {
            if (other.listaDeProdutos != null)
                return false;
        } else if (!listaDeProdutos.equals(other.listaDeProdutos))
            return false;
        if (valor == null) {
            if (other.valor != null)
                return false;
        } else if (!valor.equals(other.valor))
            return false;
        return true;
    }

}

Produto

package br.com.loja.modelo;

import java.math.BigDecimal;
import java.util.Calendar;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Transient;

@Entity
public class Produto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String nome;
    private String modelo;
    private String marca;
    private BigDecimal valor = new BigDecimal(0);
    private int qtdMinima;
    private int emEstoque;
    private Calendar dataLancamento = Calendar.getInstance();


    public Integer getId() {
        return id;
    }

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

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }

    public String getMarca() {
        return marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public BigDecimal getValor() {
        return valor;
    }

    public void setValor(BigDecimal valor) {
        this.valor = valor;
    }

    public int getQtdMinima() {
        return qtdMinima;
    }

    public void setQtdMinima(int qtdMinima) {
        this.qtdMinima = qtdMinima;
    }

    public Calendar getDataLancamento() {
        return dataLancamento;
    }

    public void setDataLancamento(Calendar dataLancamento) {
        this.dataLancamento = dataLancamento;
    }

    public int getEmEstoque() {
        return emEstoque;
    }

    public void setEmEstoque(int emEstoque) {
        this.emEstoque = emEstoque;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((dataLancamento == null) ? 0 : dataLancamento.hashCode());
        result = prime * result + emEstoque;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime * result + ((marca == null) ? 0 : marca.hashCode());
        result = prime * result + ((modelo == null) ? 0 : modelo.hashCode());
        result = prime * result + ((nome == null) ? 0 : nome.hashCode());
        result = prime * result + qtdMinima;
        result = prime * result + ((valor == null) ? 0 : valor.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;
        Produto other = (Produto) obj;
        if (dataLancamento == null) {
            if (other.dataLancamento != null)
                return false;
        } else if (!dataLancamento.equals(other.dataLancamento))
            return false;
        if (emEstoque != other.emEstoque)
            return false;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        if (marca == null) {
            if (other.marca != null)
                return false;
        } else if (!marca.equals(other.marca))
            return false;
        if (modelo == null) {
            if (other.modelo != null)
                return false;
        } else if (!modelo.equals(other.modelo))
            return false;
        if (nome == null) {
            if (other.nome != null)
                return false;
        } else if (!nome.equals(other.nome))
            return false;
        if (qtdMinima != other.qtdMinima)
            return false;
        if (valor == null) {
            if (other.valor != null)
                return false;
        } else if (!valor.equals(other.valor))
            return false;
        return true;
    }

}

Item:

package br.com.loja.modelo;

import java.math.BigDecimal;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;

@Entity
public class Item {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @OneToOne
    private Produto produto = new Produto();
    private BigDecimal quantidade = new BigDecimal(0);
    private BigDecimal valorTotal = new BigDecimal(0);


    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Produto getProduto() {
        return produto;
    }
    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    public BigDecimal getQuantidade() {
        return quantidade;
    }
    public void setQuantidade(BigDecimal quantidade) {
        this.quantidade = quantidade;
    }
    public BigDecimal getValorTotal() {
        return valorTotal;
    }
    public void setValorTotal(BigDecimal valorTotal) {
        this.valorTotal = valorTotal;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime * result + ((produto == null) ? 0 : produto.hashCode());
        result = prime * result + ((quantidade == null) ? 0 : quantidade.hashCode());
        result = prime * result + ((valorTotal == null) ? 0 : valorTotal.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;
        Item other = (Item) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        if (produto == null) {
            if (other.produto != null)
                return false;
        } else if (!produto.equals(other.produto))
            return false;
        if (quantidade == null) {
            if (other.quantidade != null)
                return false;
        } else if (!quantidade.equals(other.quantidade))
            return false;
        if (valorTotal == null) {
            if (other.valorTotal != null)
                return false;
        } else if (!valorTotal.equals(other.valorTotal))
            return false;
        return true;
    }


}

o xHTML ainda estou modificando pois estou fazendo junto a ele o curso de PrimeFaces, mas o básico já está funcionando

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="_template01.xhtml">
    <ui:define name="titulo">Home</ui:define>
    <ui:define name="conteudo">
        <title>Home</title>

        <h:form id="FormAdicionarProdutos">
            <p:messages id="messages"/>
            <p:fieldset legend="Adicionar Produto">
                <h:panelGrid columns="4">

                    <p:outputLabel value="Código do Produto: " for="lblCodProduto" />
                    <p:inputText id="lblCodProduto"
                        value="#{vendaBean.codBuscaProduto}" />


                    <p:commandButton value="Adicionar"
                        actionListener="#{vendaBean.carregaAdiciona}"
                        update="FormProdutos:tabelaProdutosAdicionados messages"
                        process="FormAdicionarProdutos"/>


                    <p:commandLink value="Verificar Estoque" />
                </h:panelGrid>
            </p:fieldset>
        </h:form>

        <h:form id="FormProdutos">
            <p:fieldset legend="Produtos Adicionados">
                <p:dataTable id="tabelaProdutosAdicionados" var="item"
                    value="#{vendaBean.venda.listaDeProdutos}">
                    <f:facet name="header">
            Produtos Adicionados
        </f:facet>
                    <p:column>
                        <f:facet name="header">Código</f:facet>
                        <h:outputLabel value="#{item.produto.id}" />
                    </p:column>
                    <p:column>
                        <f:facet name="header">Itens</f:facet>
                        <h:outputLabel value="#{item.produto.nome}" />
                    </p:column>
                    <p:column>
                        <f:facet name="header">Em estoque</f:facet>
                        <h:outputLabel value="#{item.produto.emEstoque}" />
                    </p:column>
                    <p:column>
                        <f:facet name="header">Valor</f:facet>
                        <h:outputLabel value="#{item.produto.valor}" />
                    </p:column>
                    <p:column>
                        <f:facet name="header">Quantidade</f:facet>
                        <h:inputText id="quantidade" value="#{vendaBean.item.quantidade}"/>
                        <p:commandButton value="Calcular" action="#{vendaBean.alteraItem(item)}" update="FormProdutos:tabelaProdutosAdicionados" process="FormProdutos:tabelaProdutosAdicionados"/>

                    </p:column>
                    <p:column>
                        <f:facet name="header">Total</f:facet>
                        <h:outputText id="totalPorProduto"
                            value="#{vendaBean.item.valorTotal}" />
                    </p:column>
                    <p:column>
                        <p:commandButton value="Remover"
                            action="#{vendaBean.removeItem(item)}"
                            process="FormProdutos:tabelaProdutosAdicionados"
                            update="FormProdutos:tabelaProdutosAdicionados" />
                    </p:column>
                </p:dataTable>
            </p:fieldset>
        </h:form>
        <h:form>
            <p:fieldset legend="Informações da Venda">

                <h:panelGrid columns="2">
                    <p:outputLabel value="Valor Total" />
                    <p:outputLabel value="#{vendaBean.venda.valor}" />
                    <p:outputLabel value="Data da Venda: " />
                    <p:outputLabel value="#{vendaBean.venda.data.time}" id="dataVenda">
                        <f:convertDateTime pattern="dd/MM/yyyy HH:mm"
                            timeZone="America/Sao_Paulo" />
                    </p:outputLabel>
                </h:panelGrid>
            </p:fieldset>
            <p:commandButton value="Finalizar" action="#{vendaBean.gravarVenda}" />

        </h:form>
    </ui:define>
</ui:composition>

</html>
4 respostas

Oi Rafael, mil perdões.. mas eu não entendi qual é a dúvida.

Alberto, acontece que eu não quero deixar a pessoa adicionar um produto repetido na lista, mas a verificação do método carregaAdiciona() para a mensagem de erro só funciona se eu não gravar o item no banco. Por isso deixei comentado os métodos de gravar...

//iDAO.gravarItem(item);

solução!

Bom, tem bastante código.. se os ifs não estão funcionando, vc tem que verificar seu equals. Um outro ponto, vc deveria usar um set, já que não quer elementos repetidos e não deveria colocar o id na comparação do equals.. Quando vc coloca id no equals, vc mata ele.. já que só vai funcionar quando o objeto tiver sido trazido do banco de dados.

Muito obrigado, fiquei horas pesquisando, fiz o que disse sobre não colocar o Id no equals e funcionou perfeitamente. E também alterei a lista para um HashSet, mas após fazer essa parte funcionar vou estudar um pouco melhor a estrutura para decidir os tipos de listas a utilizar... Mas muito obrigado mesmo ^^