[RESOLVIDO] Remover Item de uma List e salvar no banco

3 respostas
E

Olá galera, estou com um probleminha.
Não estou conseguindo remover um item de uma List e salvar a nova list com o item removido no banco,.
O curioso, é que para adicionar um elemento na List e salvar no banco, nao ocorre nenhum problema.
Vamos aos códigos que fica mais facil de entender o problema.

Estou usando o seguinte método para remover um item de uma List que eu recuperei do banco (Usando Hibernate JPA)
public void deletaItem(){
		FacesContext context = FacesContext.getCurrentInstance();
		DAO<PedidoCompra> dao = new DAO<PedidoCompra>(PedidoCompra.class);
		System.out.println(pedido.getItens().remove(itemSelecionado));
		dao.atualiza(pedido);
		for(ItemCompra i: pedido.getItens()){
			System.out.println("MEMORIA>>>>>>>>>> "+i.getProduto().getDescricao());
		}
		for(ItemCompra i : getListaItensPedido()){
			System.out.println("BANCO>>>>>> "+i.getProduto().getDescricao());
		}
		context.addMessage(null, new FacesMessage("Item removido!"));
		
	}
Como podem ver, existem 2
for
um, mostra a List que está em memoria, e a outra busca a list diretamente do banco. Eu faço a remoção do item na lista, salvo as alteracóes no banco, não ocorre nenhum erro, porém, quando recupero os valores do banco, as alteraçoes nao foram feitas.

E o curioso, é que usando um método que adiciona novos itens a lista, práticamente da mesma forma, as alterações no banco são realizadas.

public void adicionaItem() {
		FacesContext context = FacesContext.getCurrentInstance();
		ItemCompra item = new ItemCompra();
		DAO<Produto> dao = new DAO<Produto>(Produto.class);
		Produto p = dao.BuscaPorId(idProduto);
		item.setPedido(pedido);
		item.setProduto(p);
		item.setQuantidade(quantidade);
		item.setValorUnitario(valorUnitario);
		item.setTotal(quantidade * valorUnitario);
		pedido.getItens().add(item);
		DAO<PedidoCompra> daoPedido = new D/AO<PedidoCompra>(PedidoCompra.class);
		daoPedido.atualiza(pedido);
		context.addMessage(null, new FacesMessage(
				"Item adicionado ao Pedido n " + pedido.getId()));
	}
O código completo da Classe.
package com.perfaco.mb;

import java.io.Serializable;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.primefaces.event.SelectEvent;

import com.perfaco.dao.DAO;
import com.perfaco.dao.JPAUtil;
import com.perfaco.modelo.ItemCompra;
import com.perfaco.modelo.PedidoCompra;
import com.perfaco.modelo.Produto;

@ManagedBean
@ViewScoped
public class EditarPedidoCompra implements Serializable {
	private PedidoCompra pedido;
	private ItemCompra itemSelecionado;
	private Long idProduto;
	private Produto produto;
	private int quantidade;
	private double valorUnitario;

	public List<ItemCompra> getListaItensPedido() {
		EntityManager em = new JPAUtil().getEntityManager();
		Query q = em
				.createQuery("SELECT i FROM ItemCompra i WHERE i.pedido = :p");
		q.setParameter("p", pedido);
		return q.getResultList();
	}

	public void editaItem() {
		FacesContext context = FacesContext.getCurrentInstance();
		if (this.itemSelecionado == null) {
			context.addMessage(null, new FacesMessage("Houve um Erro"));
		} else {
			DAO<ItemCompra> dao = new DAO<ItemCompra>(ItemCompra.class);
			DAO<Produto> daoProduto = new DAO<Produto>(Produto.class);
			this.produto = daoProduto.BuscaPorId(idProduto);
			this.itemSelecionado.setProduto(produto);
			this.itemSelecionado.setTotal(getCalculaTotal());
			dao.atualiza(itemSelecionado);
			context.addMessage(null,
					new FacesMessage("Pedido n " + pedido.getId()
							+ " editado com sucesso"));
		}
	}

	public void adicionaItem() {
		FacesContext context = FacesContext.getCurrentInstance();
		ItemCompra item = new ItemCompra();
		DAO<Produto> dao = new DAO<Produto>(Produto.class);
		Produto p = dao.BuscaPorId(idProduto);
		item.setPedido(pedido);
		item.setProduto(p);
		item.setQuantidade(quantidade);
		item.setValorUnitario(valorUnitario);
		item.setTotal(quantidade * valorUnitario);
		pedido.getItens().add(item);
		DAO<PedidoCompra> daoPedido = new DAO<PedidoCompra>(PedidoCompra.class);
		daoPedido.atualiza(pedido);
		context.addMessage(null, new FacesMessage(
				"Item adicionado ao Pedido n " + pedido.getId()));
	}

	public void deletaItem(){
		FacesContext context = FacesContext.getCurrentInstance();
		DAO<PedidoCompra> dao = new DAO<PedidoCompra>(PedidoCompra.class);
		System.out.println(pedido.getItens().remove(itemSelecionado));//AQUI APARECE TRUE
		dao.atualiza(pedido);
		for(ItemCompra i: pedido.getItens()){
			System.out.println("MEMORIA>>>>>>>>>> "+i.getProduto().getDescricao());//AQUI MOSTRA A LISTA SEM O ITEM REMOVIDO
		}
		for(ItemCompra i : getListaItensPedido()){
			System.out.println("BANCO>>>>>> "+i.getProduto().getDescricao());// AQUI, O ITEM REMOVIDO APARECE. ESTE MÉTODO BUSCA DIRETO DO BANCO
		}
		context.addMessage(null, new FacesMessage("Item removido!"));
		
	}

Gostaria que vcs me ajudassem com + esse probleminha =).
E se tiverem sugestões melhores, tambem serão todas muito bem vindas!
Obrigado

3 Respostas

Hebert_Coelho

No seu método do DAO você está dando commit/flush?

E

Sim.
Classe DAO

\
package com.perfaco.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaQuery;

import com.perfaco.modelo.Fornecedor;

public class DAO<T> {
	private final Class<T> classe;
	
	public DAO(Class<T> classe){
		this.classe = classe;
	}
	
	public void adiciona(T t){
		EntityManager em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		em.persist(t);
		em.getTransaction().commit();
		em.close();
	}
	
	public void remove(T t){
		EntityManager em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		em.remove(em.merge(t));
		em.getTransaction().commit();
		em.close();
	}
	
	public void atualiza(T t){
		EntityManager em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		em.merge(t);
		em.getTransaction().commit();
		em.close();
	}
	
	public List<T> listaTodos(){
		EntityManager em = new JPAUtil().getEntityManager();
		CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
		query.select(query.from(classe));
		List<T> lista = em.createQuery(query).getResultList();
		em.close();
		return lista;
	}
	
	public T BuscaPorId(Long id){
		T object = null;
		try{
		EntityManager em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		object =(T) em.find(classe, id);
		em.getTransaction().commit();
		em.close();
		}catch (Exception e){
			System.out.println("Erro");
			e.printStackTrace();
		}
		return object;
	}
	
}

Até agora nao tive nenhum problema com os métodos.
Até pq, eu uso o método atualiza(pedido) quando vou aidicionar um novo item a list.

E

Opa, resolvi meu problema usando o orphanRemoval=true no mapeamento do meu PedidoCompra, sobrescrevendo o método equals() na classe ItemCompra e mudando algumas coizinhas do mapeamento de ItemCompra também.
=)
Problema resolvido!

Criado 21 de maio de 2012
Ultima resposta 22 de mai. de 2012
Respostas 3
Participantes 2