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

lista trazendo itens repetidos na hora de adicionar

Opa, depois de muito esforço fiz uma compra com varios produtos, porém tava me dando um erro de nullpointer quando tava assim o meu código.

public void adicionarProduto() {
        Double aux = 0.0;
        compraProdutos.add(compraProduto);
        for (Compra_produto p : compraProdutos) {
            this.compra.setValor(p.getProduto().getPreco() * p.getQuantidade());
            aux += p.getProduto().getPreco() * p.getQuantidade();
            this.compra.setPrecoTotal(aux);
            compraProduto = new Compra_produto(); // aqui limpava o meu produto e me vinha null, dai deixei desse modo.
        }
        System.out.println(aux);
    }
public void adicionarProduto() {
        Double aux = 0.0;
        compraProdutos.add(compraProduto);
        for (Compra_produto p : compraProdutos) {
            compraProduto.getCompra().setValor(p.getProduto().getPreco() * p.getQuantidade());
            aux += p.getProduto().getPreco() * p.getQuantidade();
            compraProduto.getCompra().setPrecoTotal(aux);
        }
        System.out.println(aux);
    }

perfeito ai salva 1 produto,

@Transacional
    public void salvar() {
        if (compra.getCodigo() == null) {
            compraDao.salvar(compra);
            Compra compraCodigo = compraDao.buscarPorCodigo(compra.getCodigo());
            for (Compra_produto item : compraProdutos) {
                compraProduto.setCompra(compraCodigo);
                compraProdutoDao.salvar(item);
            }
        } else {

        }
        this.compra = new Compra();
        this.compraProduto = new Compra_produto();
    }

beleza, agora no meu html tenho uma lista de produto dentro do selectOneMenu, e quando eu escolho um produto, por exemplo produto de teste, vo la escolhi ele coloquei a quandade 5 e já vem com o preço unitário do produto, Exemplo

Produto: teste, quantidade:5, preço 100.00;

Depois quero inserir outro produto para comprar, e na minha lista de produto e escolho outro exemplo radio. ai os 2 produtos viram o mesmo produto, o produto que adicionei primeiro muda para o nome e quantidade e preço unitario do 2 produto que estou comprando, como resolver isso?

7 respostas

o código que vc postou mostra uma adição numa lista, não tem ninguém se transformando em ninguém. Em que momento isso acontece? Pode mostrar a página? Outra coisa é interessante é o código completo do managed bean.

minha pagina.

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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">
        <h:form>
            <p:dataTable>
                <f:facet name="header">
                    <p:commandButton value="Compra" oncomplete="PF('compra').show();" />
                </f:facet>
            </p:dataTable>
        </h:form>

        <p:dialog widgetVar="compra" modal="true" appendTo="@(body)"
            resizable="false" closable="true" draggable="false" header="Compra">
            <h:form id="formularioCompra">
                <h:panelGrid columns="2">
                    <p:outputLabel value="Produto: " for="produto" />
                    <p:selectOneMenu id="produto"
                        value="#{compraBean.compraProduto.produto}"
                        converter="produtoConverter" required="true">
                        <f:selectItem itemValue="" itemLabel="Selecione..." />
                        <f:selectItems value="#{compraBean.listaProdutos}" var="produto"
                            itemValue="#{produto}" itemLabel="#{produto.nome}" />
                        <p:ajax listener="#{compraBean.carregarProduto(produto)}"
                            update="precoUnitario :formularioItens" />
                    </p:selectOneMenu>

                    <p:outputLabel value="Preço unitario: " for="precoUnitario" />
                    <p:inputText id="precoUnitario"
                        value="#{compraBean.compraProduto.produto.preco}" readonly="true"
                        required="true" />

                    <p:outputLabel value="Quantidade: " for="quantidade" />
                    <p:inputText id="quantidade"
                        value="#{compraBean.compraProduto.quantidade}" required="true">
                    </p:inputText>

                    <p:outputLabel value="Data: " for="data" />
                    <p:calendar id="data" value="#{compraBean.compra.data.time}"
                        required="true">
                        <f:convertDateTime pattern="dd/MM/yyyy" />
                    </p:calendar>

                </h:panelGrid>
                <h:panelGrid columns="6">
                    <p:commandButton value="Inserir"
                        actionListener="#{compraBean.adicionarProduto}"
                        update="formularioCompra :formularioItens">
                    </p:commandButton>
                </h:panelGrid>
            </h:form>

            <h:form id="formularioItens">
                <p:dataTable value="#{compraBean.compraProdutos}"
                    var="compraProduto" paginator="true" rows="3"
                    emptyMessage="Nenhum compra">
                    <p:column headerText="Produto">
                        <h:outputText value="#{compraProduto.produto.nome}" />
                    </p:column>
                    <p:column headerText="Preço unitario">
                        <h:outputText value="#{compraProduto.produto.preco}" />
                    </p:column>
                    <p:column headerText="Quantidade">
                        <h:outputText value="#{compraProduto.quantidade}" />
                    </p:column>
                </p:dataTable>
                <h:panelGrid columns="10">
                    <p:outputLabel value="Valor: " for="valor" />
                    <p:inputText id="valor" value="#{compraBean.compra.valor}" size="7">
                    </p:inputText>
                    <p:outputLabel value="Valor total da compra: " for="valorTotal" />
                    <p:inputText id="valorTotal"
                        value="#{compraBean.compra.precoTotal}" size="8" />
                    <p:outputLabel value="Pagamento: " for="pagamento" />
                    <p:selectOneMenu id="pagamento"
                        value="#{compraBean.compra.formaDePagamento}" filter="true"
                        converter="formaDePagamentoConverter">
                        <f:selectItem itemValue="" itemLabel="Selecione..." />
                        <f:selectItems value="#{compraBean.listaPagamentos}"
                            var="pagamento" itemValue="#{pagamento}"
                            itemLabel="#{pagamento.descricao}" />
                    </p:selectOneMenu>

                    <p:outputLabel value="Parcela: " for="parcela" />
                    <p:selectOneMenu id="parcela"
                        value="#{compraBean.compra.quantidadeParcela}" filter="true"
                        converter="formaDePagamentoConverter">
                        <f:selectItem itemValue="" itemLabel="Selecione..." />
                        <f:selectItems value="#{compraBean.listaParcelas}" var="p"
                            itemValue="#{p}" itemLabel="#{p.quantidadeParcela}" />
                    </p:selectOneMenu>
                    <p:commandButton value="Finalizar"
                        actionListener="#{compraBean.salvar}" />
                </h:panelGrid>
            </h:form>
        </p:dialog>
    </ui:define>
</ui:composition>
</html>

meu bean

import java.io.Serializable;
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.anotacao.Transacional;
import br.com.bercalini.dao.CompraDao;
import br.com.bercalini.dao.CompraProdutoDao;
import br.com.bercalini.dao.FormaDePagamentoDao;
import br.com.bercalini.dao.ProdutoDao;
import br.com.bercalini.dao.QuantidadeParcelaDao;
import br.com.bercalini.modelo.Compra;
import br.com.bercalini.modelo.Compra_produto;
import br.com.bercalini.modelo.FormaDePagamento;
import br.com.bercalini.modelo.Produto;
import br.com.bercalini.modelo.QuantidadeParcela;
import br.com.bercalini.util.Mensagem;

@Named(value = "compraBean")
@ViewScoped
@SuppressWarnings("serial")
public class CompraBean implements Serializable {

    @Inject
    private ProdutoDao produtoDao;
    @Inject
    private Compra_produto compraProduto;
    @Inject
    private Compra compra;
    @Inject
    private Produto produto;
    @Inject
    private CompraProdutoDao compraProdutoDao;
    @Inject
    private FormaDePagamentoDao formaDePagamentoDao;
    @Inject
    private QuantidadeParcelaDao quantidadeParcelaDao;
    @Inject
    private CompraDao compraDao;
    private List<Compra_produto> compraProdutos = new ArrayList<Compra_produto>();

    public void adicionarProduto() {
        Double aux = 0.0;
        compraProdutos.add(compraProduto);
        for (Compra_produto p : compraProdutos) {
            this.compra.setValor(p.getProduto().getPreco() * p.getQuantidade());
            aux += p.getProduto().getPreco() * p.getQuantidade();
            this.compra.setPrecoTotal(aux);
            System.out.println(compraProdutos.size());
            compraProduto = new Compra_produto();
            System.out.println(p.getProduto().getNome());
            System.out.println(compraProdutos.size());
        }
        System.out.println(aux);
    }

    @Transacional
    public void salvar() {
        System.out.println(compraProdutos.size());
        if (compra.getCodigo() == null) {
            compraDao.salvar(compra);
            Compra compraCodigo = compraDao.buscarPorCodigo(compra.getCodigo());
            compraProduto.setCompra(compraCodigo);
            for (Compra_produto item : compraProdutos) {
                System.out.println(compraProdutos.size());
                System.out.println(item.getProduto().getNome());
                compraProdutoDao.salvar(item);
            }
        } else {

        }
        this.compra = new Compra();
        this.compraProduto = new Compra_produto();
    }

    @Transacional
    public List<FormaDePagamento> getListaPagamentos() {
        return formaDePagamentoDao.lista();
    }

    @Transacional
    public List<QuantidadeParcela> getListaParcelas() {
        return quantidadeParcelaDao.lista();
    }

    @Transacional
    public List<Compra_produto> getListaCompraProdutos() {
        return compraProdutoDao.lista();
    }

    @Transacional
    public List<Produto> getListaProdutos() {
        return produtoDao.listaProdutos();
    }

    @SuppressWarnings("unused")
    @Transacional
    public void valorProduto() {
        List<Produto> produtos = produtoDao.listaProdutos();
        for (Produto produto : produtos) {
            compra.setPrecoTotal(compraProduto.getQuantidade()
                    * compraProduto.getProduto().getPreco());
        }
        System.out.println("Preço total da compra: "
                + this.compra.getPrecoTotal());
    }

    @SuppressWarnings("unused")
    public void somarParcela() {
        List<QuantidadeParcela> parcelas = quantidadeParcelaDao.lista();
        for (QuantidadeParcela quantidadeParcela : parcelas) {
            compra.setValorParcela(compra.getPrecoTotal()
                    / compra.getQuantidadeParcela().getQuantidadeParcela());
        }
        System.out.println("Preço total parcela: "
                + this.compra.getPrecoTotal());
    }

    public void carregarProduto(Produto produto) {
        this.produto = produto;
    }

o método adicionarProduto é chamado quando ? Não to vendo adicionar nada na lista.. O tempo inteiro vc substitui a compra na compraproduto... deve ser por isso..

Aqui o meu metodo é chamado aqui.

  <h:panelGrid columns="6">
                    <p:commandButton value="Inserir"
                        actionListener="#{compraBean.adicionarProduto}"
                        update="formularioCompra :formularioItens">
                    </p:commandButton>
                </h:panelGrid>

É chamado quando eu quero adicionar o produto na minha lista para mim adicionar ela no add, e depois para mim ver oque eu estou comprando em uma tabela usando o metodo da lista que seria esse caso.

<h:form id="formularioItens">
                <p:dataTable value="#{compraBean.compraProdutos}"
                    var="compraProduto" paginator="true" rows="3"
                    emptyMessage="Nenhum compra">
                    <p:column headerText="Produto">
                        <h:outputText value="#{compraProduto.produto.nome}" />
                    </p:column>
                    <p:column headerText="Preço unitario">
                        <h:outputText value="#{compraProduto.produto.preco}" />
                    </p:column>
                    <p:column headerText="Quantidade">
                        <h:outputText value="#{compraProduto.quantidade}" />
                    </p:column>
                </p:dataTable>
                <h:panelGrid columns="10">
                    <p:outputLabel value="Valor: " for="valor" />
                    <p:inputText id="valor" value="#{compraBean.compra.valor}" size="7">
                    </p:inputText>
                    <p:outputLabel value="Valor total da compra: " for="valorTotal" />
                    <p:inputText id="valorTotal"
                        value="#{compraBean.compra.precoTotal}" size="8" />
                    <p:outputLabel value="Pagamento: " for="pagamento" />
                    <p:selectOneMenu id="pagamento"
                        value="#{compraBean.compra.formaDePagamento}" filter="true"
                        converter="formaDePagamentoConverter">
                        <f:selectItem itemValue="" itemLabel="Selecione..." />
                        <f:selectItems value="#{compraBean.listaPagamentos}"
                            var="pagamento" itemValue="#{pagamento}"
                            itemLabel="#{pagamento.descricao}" />
                    </p:selectOneMenu>

Alberto poderia me ajudar? ainda to preso aqui :( oque estou errando?

solução!

Alberto poderia ver se o jeito que eu fiz está correto?

@Named(value = "compraBean")
@ViewScoped
@SuppressWarnings("serial")
public class CompraBean implements Serializable {

    @Inject
    private ProdutoDao produtoDao;
    @Inject
    private Compra_produto compraProduto;
    @Inject
    private Compra compra;
    @Inject
    private Produto produto;
    @Inject
    private CompraProdutoDao compraProdutoDao;
    @Inject
    private FormaDePagamentoDao formaDePagamentoDao;
    @Inject
    private QuantidadeParcelaDao quantidadeParcelaDao;
    @Inject
    private CompraDao compraDao;
    private Long codigo;
    private List<Compra_produto> compraProdutos = new ArrayList<Compra_produto>();

    public void adicionarProduto(Produto produtoAdicionado) {
        this.codigo = produtoAdicionado.getCodigo();
        System.out.println(codigo);
        compraProduto = new Compra_produto();
        System.out.println("Produto adicionado:" + produtoAdicionado);
        System.out.println("Quantidade de produto: "
                + compraProduto.getQuantidade());
        compraProduto.setProduto(produtoAdicionado);
        System.out.println(compra.getValor());
        compraProdutos.add(compraProduto);
    }

    public void carregar() {
        Double aux = 0.0D;
        for (Compra_produto p : compraProdutos) {
            System.out.println(compraProdutos.size());
            this.compra.setValor(p.getProduto().getPreco() * p.getQuantidade());
            aux += p.getProduto().getPreco() * p.getQuantidade();
            this.compra.setPrecoTotal(aux);
        }
        System.out.println(compra.getPrecoTotal());
        System.out.println(codigo);
    }

    @Transacional
    public void salvar() {
        System.out.println(compraProdutos.size());
        if (compra.getCodigo() == null) {
            compraDao.salvar(compra);
            Compra compraCodigo = compraDao.buscarPorCodigo(compra.getCodigo());
            for (Compra_produto item : compraProdutos) {
                item.setCompra(compraCodigo);
                compraProdutoDao.salvar(item);
            }
        } else {

        }
        this.compra = new Compra();
        this.compraProduto = new Compra_produto();
    }
<ui:composition template="/template/template.xhtml">
    <ui:define name="conteudo">
        <h:form>
            <p:dataTable>
                <f:facet name="header">
                    <p:commandButton value="Compra" oncomplete="PF('compra').show();" />
                </f:facet>
            </p:dataTable>
        </h:form>

        <p:dialog widgetVar="compra" modal="true" appendTo="@(body)"
            resizable="false" closable="true" draggable="false" header="Compra">
            <h:form id="tabelaProduto">
                <p:dataTable paginator="true" rows="4"
                    emptyMessage="Nenhum produto encontrado"
                    value="#{compraBean.listaProdutos}" var="produto">
                    <p:column headerText="Código" filterBy="#{produto.codigo}">
                        <h:outputText value="#{produto.codigo}" />
                    </p:column>
                    <p:column headerText="Nome" filterBy="#{produto.nome}">
                        <h:outputText value="#{produto.nome}" />
                    </p:column>
                    <p:column headerText="Estoque">
                        <h:outputText value="#{produto.estoque.quantidade}" />
                    </p:column>
                    <p:column headerText="Preço" filterBy="#{produto.preco}">
                        <h:outputText value="#{produto.preco}" />
                    </p:column>
                    <p:column headerText="Opção">
                        <p:commandButton value="Adicionar"
                            actionListener="#{compraBean.adicionarProduto(produto)}"
                            oncomplete="PF('quantidade').show();"
                            update=":formularioQuantidade" />
                    </p:column>
                </p:dataTable>
            </h:form>

            <p:separator />

            <h:form id="formularioProdutos">
                <p:dataTable paginator="true" rows="4"
                    value="#{compraBean.compraProdutos}" var="compraProduto"
                    emptyMessage="">
                    <p:column headerText="Produto">
                        <h:outputText value="#{compraProduto.produto.nome}" />
                    </p:column>
                    <p:column headerText="Quantidade">
                        <h:outputText value="#{compraProduto.quantidade}" />
                    </p:column>
                    <p:column headerText="Preço unitario">
                        <h:outputText value="#{compraProduto.produto.preco}" />
                    </p:column>
                </p:dataTable>
                <h:panelGrid columns="9">
                    <p:outputLabel value="Valor: " for="valor" />
                    <p:inputText id="valor" value="#{compraBean.compra.valor}"
                        readonly="true" />
                    <p:outputLabel value="Valor Total: " for="valorTotal" />
                    <p:inputText id="valorTotal"
                        value="#{compraBean.compra.precoTotal}" readonly="true" size="8" />
                    <p:outputLabel value="Pagamento: " for="pagamento" />
                    <p:selectOneMenu id="pagamento"
                        value="#{compraBean.compra.formaDePagamento}" filter="true"
                        converter="formaDePagamentoConverter">
                        <f:selectItem itemValue="" itemLabel="Selecione..." />
                        <f:selectItems value="#{compraBean.listaPagamentos}"
                            var="pagamentos" itemValue="#{pagamentos}"
                            itemLabel="#{pagamentos.descricao}" />
                    </p:selectOneMenu>
                    <p:outputLabel value="Parcelas: " for="parcela" />
                    <p:selectOneMenu id="parcela"
                        value="#{compraBean.compra.quantidadeParcela}" filter="true"
                        converter="quantidadeParcelaConveter">
                        <f:selectItem itemValue="" itemLabel="Selecione..." />
                        <f:selectItems value="#{compraBean.listaParcelas}" var="parcelas"
                            itemValue="#{parcelas}" itemLabel="#{parcelas.quantidadeParcela}" />
                    </p:selectOneMenu>
                    <p:commandButton value="Salvar"
                        actionListener="#{compraBean.salvar}" />
                </h:panelGrid>
            </h:form>
        </p:dialog>

        <p:dialog widgetVar="quantidade" modal="true" appendTo="@(body)"
            resizable="false" closable="true" draggable="false"
            header="Quantidade de produto">
            <h:form id="formularioQuantidade">
                <h:panelGrid columns="2">
                    <p:outputLabel value="Quantidade: " for="quantidade" />
                    <p:inputText id="quantidade"
                        value="#{compraBean.compraProduto.quantidade}" required="true" />
                    <p:commandButton value="Ok" actionListener="#{compraBean.carregar}"
                        oncomplete="PF('quantidade').hide();" update=":formularioProdutos"
                        style="margin-left:50px" />
                    <p:commandButton value="Cancelar"
                        onclick="PF('quantidade').hide();" />
                </h:panelGrid>
            </h:form>
        </p:dialog>
    </ui:define>
</ui:composition>
</html>

depois tava me retornando esse erro aqui.

different object with the same identifier value was already associated with the session

Depois joguei ele no google e vi que era por causa do id autoincremento algo assim correto? ai deixei a minha entidade assim.

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

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long Codigo;
    @ManyToOne
    @JoinColumn(name = "Compra_codigo", nullable = true)
    private Compra compra = new Compra();
    @ManyToOne
    @JoinColumn(name = "produtos_codigo", nullable = true)
    private Produto produto = new Produto();
    private Integer quantidade;

colocando o id la como auto, esse jeito está correto? é oque veio em mente e oque consegui fazer :(

Oi Alisson, não vou mentir, é muito código para analisar e ta bem complicado de entender o que vc ta fazendo... O erro que deu era especifico do hibernate.. vc tinha carregado um objeto com o id e depois tava pegando outro, setando o mesmo id e tentando chamar um merge ou persist.. se vc resolveu, ta otimo.