Ajuda não consigo salva na minha tabela estoque o produto

21 respostas
jsfjavamysql
L

segue a modelagem de minhas tabelas a cima não estou conseguindo salvar a minha compra no Meu estoque ele cria o ID mas nao ta chegando mais nada la

Esse é meu CompraControlador com metodo salvar

public void salvar() {

selecionado.setItens(selectedProduto);

    if (selecionado.getId() == null) {

        compraFacade.salvaNovo(selecionado);
    }
    navegarEmbora();
}

public Compra getCompra() {

    return compra;
}

Esse é meu CompraFacade com metodo salvarNovo

public void salvaNovo(Compra selecionado) {

for (ItemCompra item : selecionado.getItens()) {

        Estoque estoque = estoqueFacade.buscarEstoque(item.getProduto());

        if (estoque == null) {

            estoqueFacade.salvarNovo(estoque);

        } else {
            estoqueFacade.salvar(estoque);
        }
    }
    em.persist(selecionado);
}

e por ultimo o EstoqueFacade com dois metodos que são chamados no CompraFacade

public void salvarNovo(Estoque estoque) {

estoque = new Estoque();
    estoque.setProduto(estoque.getProduto());
    estoque.setQuantidade(estoque.getQuantidade());
    estoque.setData(estoque.getData());
    em.merge(estoque);

}

public void salvar(Estoque estoque) {

    estoque.setQuantidade(estoque.getQuantidade() + estoque.getQuantidade());
    em.persist(estoque);

}

21 Respostas

J

Não esta reportando nenhum erro tipo NullException?

S

Nesta linha você está “matando” o estoque recebido por parâmetro.

L

não está

L

se eu tirar essa linha da java.lang.NullPointerException

C

manda o erro do console.

em.merge(estoque);//
não esotu lembrado direito. mas o método merge é pra alterar…
não vi você instânciando o entity manager.
mas tu teria que fazer algo assim…

EntityManagerFactory emf = Persistence.createEntityManagerFactory(teste);

EntityManager em = emf.createEntityManager();

em.getTransaction().begin();

em.persist(salvarusuario);

em.getTransaction().commit();
em.close();
L

nao ta dando errro do modo que o codigo está o problema é esse abaixo quando eu salvo a compra os produtos vendidos não estao sendo gravados no estoque só está criando os ids do estoque

C

ahhh pow,
então provavelmente o erro está no servlet.
verifique se você está passando os nomes do componente correto no seu servlet.

L

a tabela compra e itemcompra esta sendo povoada somente a estoque não

C

olhou o seu servlet?
posta o código do servlet e da pagina onde vc cadastra essas informações.

L

A pagina de cadastro compra :

<?xml version='1.0' encoding='UTF-8' ?>
<p:panel header="Informações sobre a compra">
            <p:panelGrid columns="4" styleClass="mrig05" style="align-items: baseline">
                <h:outputText value="Codigo da Compra"/>
                <h:inputText value="#{compraControlador.selecionado.cod}"/>
                <h:outputText value="Data da Compra"/>
                <p:calendar   value="#{compraControlador.selecionado.data}" pattern="dd-MM-yyyy" mask="true"/>
                <h:outputText value="Descrição da compra"/>
                <h:inputTextarea value="#{compraControlador.selecionado.descricao}"/>
            </p:panelGrid>
            </p:panel>

            <p:fieldset id="availablProdutoField" legend="Produtos Disponiveis">
                <p:dataTable id="availableProdutos" var="prod" value="#{compraControlador.produtos}">
                    <p:column style="width:40px">
                        <h:outputText id="dragIcon" styleClass="ui-icon ui-icon-arrow-4"/>
                        <p:draggable for="dragIcon" revert="true" helper="clone"/>
                    </p:column>

                    <p:column headerText="Id">
                        <h:outputText value="#{prod.produto.id}"/>
                    </p:column>

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

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

                </p:dataTable>

            </p:fieldset>

            <p:fieldset id="selectedProdutos" legend="Produtos Selecionados" style="margin-top:20px">
                <p:outputPanel id="dropArea" >
                    <h:outputText value="!!!Solte aqui os Produtos!!!"
                                  rendered="#{empty compraControlador.selectedProduto}"
                                  style="font-size:24px;"/>
                    <p:dataTable id="selectedProdutoTable" var="prod" value="#{compraControlador.selectedProduto}"
                                 rendered="#{not empty compraControlador.selectedProduto}"
                                 styleClass="mrig05" style="margin-bottom: 10px">

                        <p:column headerText="Id">
                            <h:outputText value="#{prod.produto.id}"/>
                        </p:column>

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

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

                        <p:column style="width:150px" headerText="Qtd.">
                            <p:inputText value="#{prod.quantidade}">
                                <p:ajax event="blur" process="@this"/>
                            </p:inputText>
                        </p:column>

                    </p:dataTable>
                </p:outputPanel>
            </p:fieldset>

            <p:commandButton value="salva" actionListener="#{compraControlador.salvar}"
                             onclick="PF('statusDialog').show();"
                             oncomplete="PF('statusDialog').hide()"
                             icon="ui-icon-disk" styleClass="mrig05">

            </p:commandButton>

            <p:button value="Cancelar"
                      icon="ui-icon-arrow"
                      href="/admin/compra/listar/" styleClass="mrig05"/>
        </p:panel>

        <p:droppable for="selectedProdutos" tolerance="touch" activeStyleClass="ui-state-highlight"
                     datasource="availableProdutos" onDrop="handleDrop">
            <p:ajax listener="#{compraControlador.onProdutoDrop}" update="dropArea availableProdutos"/>
        </p:droppable>
    </h:form>
</ui:define>

</ui:composition>

FacadeCompra = Servelet

package br.com.romaninisistemas.negocio;

import br.com.romaninisistemas.entidade.Compra;

import br.com.romaninisistemas.entidade.Estoque;

import br.com.romaninisistemas.entidade.ItemCompra;

import br.com.romaninisistemas.supers.AbstractFacade;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Repository;

import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

import java.util.Date;

/**

  • Created by fonseca on 12/8/17.
    */
    @Repository
    @Transactional
    public class CompraFacade extends AbstractFacade {

    @PersistenceContext
    
    private EntityManager em;
    
    private Compra compra;
    
    @Autowired
    
    private EstoqueFacade estoqueFacade;
    

    public CompraFacade() {

    super(Compra.class);
    

    }

    @Override
    public EntityManager getEntityManager() {

    return em;
    

    }

    public void salvaNovo(Compra selecionado) {

    for (ItemCompra item : selecionado.getItens()) {
    
         Estoque estoque = estoqueFacade.buscarEstoque(item.getProduto());
    
         if (estoque == null) {
    
             estoqueFacade.salvarNovo(estoque);
    
         } else {
             estoqueFacade.salvar(estoque);
         }
     }
     em.persist(selecionado);
    

    }

    public void setCompra(Compra compra) {
    
    this.compra = compra;
    
    }
    
    public Compra getCompra() {
    
    return compra;
    
    }
    
    public void setEstoqueFacade(EstoqueFacade estoqueFacade) {
    
    this.estoqueFacade = estoqueFacade;
    
    }
    
    }
    

Controlador Bean compra

package br.com.romaninisistemas.controlador;

/**

  • Created by fonseca on 12/8/17.
    */
import br.com.romaninisistemas.entidade.Compra;

import br.com.romaninisistemas.entidade.Estoque;

import br.com.romaninisistemas.entidade.ItemCompra;

import br.com.romaninisistemas.entidade.Produto;

import br.com.romaninisistemas.negocio.CompraFacade;

import br.com.romaninisistemas.negocio.EstoqueFacade;

import br.com.romaninisistemas.negocio.ItemCompraFacade;

import br.com.romaninisistemas.negocio.ProdutoFacade;

import br.com.romaninisistemas.supers.AbstractControlador;

import br.com.romaninisistemas.supers.AbstractFacade;

import br.com.romaninisistemas.util.FacesContextUtil;

import com.google.common.collect.Lists;

import com.ocpsoft.pretty.faces.annotation.URLAction;

import com.ocpsoft.pretty.faces.annotation.URLMapping;

import com.ocpsoft.pretty.faces.annotation.URLMappings;

import org.primefaces.event.DragDropEvent;

import org.springframework.beans.factory.annotation.Autowired;
import javax.faces.bean.ManagedBean;

import javax.faces.bean.ViewScoped;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;
@ManagedBean

@ViewScoped

@URLMappings(mappings = {

@URLMapping(id = novo-compras, pattern = /admin/compra/novo/, viewId = /faces/admin/cadastros/compra/editar.xhtml)

})
public class CompraControlador extends AbstractControlador {

@Autowired
private CompraFacade compraFacade;
@Autowired
private ProdutoFacade produtoFacade;

@Autowired
private EstoqueFacade estoqueFacade;

private ItemCompra itemCompra;
private Compra compra;
private List<ItemCompra> selectedProduto;
private List<ItemCompra> produtos;
private Estoque estoque;


@Override
public AbstractFacade getFacade() {

    return compraFacade;
}

public CompraControlador() {

    super(Compra.class);
}

@URLAction(mappingId = "novo-compras", phaseId = URLAction.PhaseId.RENDER_RESPONSE, onPostback = false)
public void novo() {
    super.novo();
    selectedProduto = new ArrayList<ItemCompra>();
    produtos = getTodosProdutos();

}

public void onProdutoDrop(DragDropEvent ddEvent) {
    ItemCompra produto = ((ItemCompra) ddEvent.getData());
    selectedProduto.add(produto);
    produtos.remove(produto);
}

public List<ItemCompra> getTodosProdutos() {
    List<Produto> produtos = produtoFacade.listar();
    List<ItemCompra> itens = Lists.newArrayList();
    for (Produto produto : produtos) {
        itens.add(new ItemCompra(selecionado, produto));
    }
    return itens;
}


public void salvar() {

    selecionado.setItens(selectedProduto);

    if (selecionado.getId() == null) {

        compraFacade.salvaNovo(selecionado);
    }
    navegarEmbora();
}

public Compra getCompra() {

    return compra;
}



public void setCompra(Compra compra) {

    this.compra = compra;
}

public List<ItemCompra> getSelectedProduto() {

    return selectedProduto;
}

public List<ItemCompra> getProdutos() {

    return produtos;
}

public ItemCompra getItemCompra() {
    return itemCompra;
}

public void setItemCompra(ItemCompra itemCompra) {
    this.itemCompra = itemCompra;
}

public Estoque getEstoque() {
    return estoque;
}

public void setEstoque(Estoque estoque) {
    this.estoque = estoque;
}

public EstoqueFacade getEstoqueFacade() {
    return estoqueFacade;
}

public void setEstoqueFacade(EstoqueFacade estoqueFacade) {
    this.estoqueFacade = estoqueFacade;
}

}

FacadeEstoque

package br.com.romaninisistemas.negocio;

import br.com.romaninisistemas.entidade.Estoque;

import br.com.romaninisistemas.entidade.Produto;

import br.com.romaninisistemas.exceptions.ExcecaoNegocioGenerica;

import br.com.romaninisistemas.supers.AbstractFacade;

import com.google.common.collect.Lists;

import org.springframework.stereotype.Repository;

import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;

import javax.persistence.NoResultException;

import javax.persistence.PersistenceContext;

import javax.persistence.Query;

import java.util.Date;

import java.util.List;

/**

  • Created by fonseca on 12/4/17.
    */
    @Repository
    @Transactional
    public class EstoqueFacade extends AbstractFacade {

    @PersistenceContext
    private EntityManager em;

    Estoque estoque;

    public EstoqueFacade() {
    
    super(Estoque.class);
    
    }
    
    <a class="mention" href="/u/override">@Override</a>
    
    public EntityManager getEntityManager() {
    
    return em;
    
    }
    
    public List getallEstoque() {
    
    String sql = "Select estoq.* from Estoque estoq order by 1 ";
    
    Query q = em.createNativeQuery(sql, Estoque.class);
    
    try {
         return q.getResultList();
     } catch (NoResultException nre) {
         return Lists.newArrayList();
     } catch (Exception ex) {
         ex.printStackTrace();
     }
     return Lists.newArrayList();
    

    }

    public void deletar(Estoque selecionado) {

    em.remove(em.find(Estoque.class, selecionado.getId()));
    

    }

    public void salvarNovo(Estoque estoque) {

    estoque = new Estoque();
     estoque.setProduto(estoque.getProduto());
     estoque.setQuantidade(estoque.getQuantidade());
     estoque.setData(estoque.getData());
     em.persist(estoque);
    

    }

    public void salvar(Estoque estoque) {

    estoque.setQuantidade(estoque.getQuantidade() + estoque.getQuantidade());
     em.merge(estoque);
    

    }

    public Estoque buscarEstoque(final Produto produto) {

    String sql = "select t from estoque t where t.produto_id = :produto ";
    
     Query q = em.createNativeQuery(sql, Estoque.class);
     q.setParameter("produto", produto.getId());
     q.setMaxResults(1);
    
     try {
         return (Estoque) q.getSingleResult();
     } catch (NoResultException nre) {
         return null;
     }
    

    }

    /**

    • Para pegar o id do estoque

    • @Id
      */
      public Estoque buscarEstoquePorId(Estoque id) {

      String sql = "select t from Estoque t where <a href="http://t.id">t.id</a> = :id ";
      
      Query q = em.createNativeQuery(sql, Estoque.class);
      
      q.setParameter(“id”, id);
      
      q.setMaxResults(1);
      
      try {
      
      return (Estoque) q.getSingleResult();
      
      } catch (NoResultException nre) {
      
      return null;
      
      }
      
      }
      
      }
      
T

Você tem valores padrão para produto , quantidade e data?

Se todos eles forem vazio seu banco vai salvar vazio mesmo.

Pq quando você faz

estoque = new Estoque(); 
estoque.setProduto(estoque.getProduto()); //Faz sentido? Acho que não,  que como o @staroski disse, voce mata o estoque recebido como padrão.  
estoque.setQuantidade(estoque.getQuantidade());
estoque.setData(estoque.getData());

Mas faz o seguinte teste.

estoque = new Estoque(); 
estoque.setProduto("Produto teste");
estoque.setQuantidade(10);
estoque.setData(new Date());

Ve se vai salvar… Se salvar, você sabe onde ta o erro.

L

é porque é um objeto carregando varios produtos nao se você viu minha tela lá é um drag drop

D

Fiquei meio confuso, porque no ato da venda você está criando um novo estoque?
Isso não deveria ser feito quando você cadastra o produto e na venda você só atualiza a quantidade disponível desse produto, subtraindo da quantidade existente a quantidade vendida?

L

mas se eu tirar da nullpoint é compra mano ainda nao fiz a venda

T

Será então que o seu SalvarNovo não deveria receber o Produto ao inves do Estoque?

Aí faria sentido você dar um new Estoque no metodo salvarNovo.

L

dentro do salvarNovo da compra chamo o metodo salvarnovo do estoque eu tirei o new Estoque olha o que da

T

Aí vai dar exception mesmo… Pois vc so chama o salvarNovo se o seu estoque for null…

Ainda acho que você queria passar o Produto para criar um novo estoque deste produto.

D

Desculpe, associei a compra com o ato do usuario comprar o produto já, que nesse caso é a venda.

Troque no seu codigo, depois dele buscar por algo assim:

if (estoque == null) {

Estoque estoque = new Estoque();

estoque.setProduto(item.getProduto());

estoque.setCompra(item.getCompra());

estoque.setQuantidade(item.getQuantidade());

estoqueFacade.salvarNovo(estoque);

Do jeito que vc ta passando, se ele não acha no estoque (null) ele manda um estoque vazio pra ser salvo.

L

nossa mano valeu ajudou demais resolveu meu problema

L

Obrigado a todos valeu galera

S

Sim você está fazendo a variável do parâmetro estoque apontar para um novo objeto.
Se ele está vindo null, é porque alguém passou um objeto null por parâmetro então você tem que ver quem chamou esse método passando null.

Criado 21 de dezembro de 2017
Ultima resposta 22 de dez. de 2017
Respostas 21
Participantes 6