4
respostas

Dúvida para remover os inserts feitos anteriormente

Estou editando esse tópico pois consegui esclarecer um pouco minhas duvidas, porém a questão principal ainda está em aberto.

Não consigo remover o produto da tabela pela IDE, apenas pelo cmd do MySQL.

Fiz um teste, removi tudo e cadastrei novamente o produto e a categoria dessa maneira:

em.getTransaction().begin();
categoriaDAO.cadastrar(celulares);
    produtoDAO.cadastrar(celular);

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

Ao tentar excluir ele não retorna nenhuma exception, porém não é excluído do banco de dados com o método de remover escrito na aula, continua na tabela do MySQL.

em.getTransaction().begin();

    produtoDAO.remover(celular);

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

E retorna o seguinte no console:

Hibernate: 
    insert 
    into
        produtos
        (categoria_id, dataCadastro, descricao, nome, preco) 
    values
        (?, ?, ?, ?, ?)
Hibernate: 
    delete 
    from
        produtos 
    where
        id=?

Já quebrei bastante a cabeça e não consegui achar a solução para isso ou o que está dando de errado.

4 respostas

Oi Matheus,

Posta aqui o seu código completo. Tanto da classe de teste quanto da classe Dao

ProdutoDAO:

package br.com.alura.loja.dao;

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

import javax.persistence.EntityManager;

import br.com.alura.loja.modelo.Produto;

public class ProdutoDAO {

    private EntityManager em;

    public ProdutoDAO(EntityManager em) {
        this.em = em;
    }

    public void cadastrar(Produto produto) {
        this.em.persist(produto);
    }

    public Produto buscarPorId(Long id) {
        return em.find(Produto.class, id);

    }

    public List<Produto> buscarTodos() {
        String jpql = "SELECT p FROM Produto p";
        return em.createQuery(jpql, Produto.class).getResultList();
    }

    public List<Produto> buscarPorNome(String nome) {
        String jpql = "SELECT p FROM Produto p WHERE p.nome = : nome";
        return em.createQuery(jpql, Produto.class).setParameter("nome", nome)
                .getResultList();
    }

    public List<Produto> buscarPorNomeDaCategoria(String nome) {
        String jpql = "SELECT p FROM Produto p WHERE p.categoria.nome = : nome";
        return em.createQuery(jpql, Produto.class).setParameter("nome", nome)
                .getResultList();
    }

    public void remover(Produto produto) {
        produto = em.merge(produto);
        this.em.remove(produto);
    }

    public BigDecimal buscarPrecoDoProdutoComNome(String nome) {
        String jpql = "SELECT p.preco FROM Produto p WHERE p.nome = :nome";
        return em.createQuery(jpql, BigDecimal.class).setParameter("nome", nome)
                .getSingleResult();    
    }


}

CategoriaDAO:

package br.com.alura.loja.dao;

import javax.persistence.EntityManager;

import br.com.alura.loja.modelo.Categoria;
import br.com.alura.loja.modelo.Produto;

public class CategoriaDAO {

    private EntityManager em;

    public CategoriaDAO(EntityManager em) {
        this.em = em;
    }

    public void cadastrar(Categoria categoria) {
        this.em.persist(categoria);
    }

    public void atualizar(Categoria categoria) {
        this.em.merge(categoria);
    }

    public void removerCategoria(Categoria categoria) {
        categoria = em.merge(categoria);
        this.em.remove(categoria);
    }

 }

CadastroDeProduto (classe de testes)


package br.com.alura.loja.testes;

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

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import br.com.alura.loja.dao.CategoriaDAO;
import br.com.alura.loja.dao.ProdutoDAO;
import br.com.alura.loja.modelo.Categoria;
import br.com.alura.loja.modelo.Produto;
import br.com.alura.loja.util.JPAUtil;

public class CadastroDeProduto {

    public static void main(String[] args) {

        cadastrarProduto();
        EntityManager em = JPAUtil.getEntityManager();
        ProdutoDAO produtoDAO = new ProdutoDAO(em);

//        Produto p = produtoDAO.buscarPorId(1l);
//        System.out.println(p.getPreco());

//        List<Produto> todos = produtoDAO.buscarPorNomeDaCategoria("CELULARES");
//        todos.forEach(p2 -> System.out.println(p.getNome()));

//        BigDecimal precoDoProduto = produtoDAO.buscarPrecoDoProdutoComNome("Xiaomi Redmi");
//        System.out.println(precoDoProduto);
    }

    private static void cadastrarProduto() {
        Categoria celulares = new Categoria("CELULARES");    
        Produto celular = new Produto("Iphone XR", "Semi-novo", new BigDecimal("2000"), celulares);

        EntityManager em = JPAUtil.getEntityManager();
        ProdutoDAO produtoDAO = new ProdutoDAO(em);
        CategoriaDAO categoriaDAO = new CategoriaDAO(em);

            em.getTransaction().begin();

            produtoDAO.remover(celular);

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

    }
}

Comentei os outros testes pra fazer o teste somente do método de remover.

Acho que o problema é que do jeito que ficou seu método cadastrarProduto, você está tentando remover um produto que ainda nem foi salvo no banco de dados:

produtoDAO.remover(celular);

Sendo que esse objeto celular acabou de se instanciado na segunda linha do método e não teve um persist nele antes de chamar o remove.

Então, aí que está o problema, estou checando no MySQL e ele está sendo salvo no banco de dados, se eu cadastro a categoria ou produto ele vai sem problemas, mas quando tento remover mesmo usando o persist e o próprio método remover já dando merge no caso de ele estar detached, não funciona.

Ele não dá uma exception, como eu disse, mas não deleta do banco de dados e devolve os dados do hibernate que mencionei.

Só se ele está criando o produto e em seguida deletando por algum motivo, pois ele dá um INSERT e em seguida o DELETE, porém como estaria fazendo isso se nem estou solicitando cadastro? kkkk

Hibernate: 
    insert 
    into
        produtos
        (categoria_id, dataCadastro, descricao, nome, preco) 
    values
        (?, ?, ?, ?, ?)
Hibernate: 
    delete 
    from
        produtos 
    where
        id=?
em.getTransaction().begin();

            em.persist(celular);
            produtoDAO.remover(celular);

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