1
resposta

[Dúvida] Repetindo linha no MySQL

Boa noite!

Estou com um problema, quando eu executo mais de uma vez o programa, em vez de só atualizar os dados no mysql, ele cria uma nova linha, como eu posso resolver isso?

Codigo:

package br.com.alura.loja.testes;

import java.math.BigDecimal;
import javax.persistence.EntityManager;
import br.com.alura.dao.CategoriaDao;
import br.com.alura.dao.ClienteDao;
import br.com.alura.dao.PedidoDao;
import br.com.alura.dao.ProdutoDao;
import br.com.alura.loja.modelo.Categoria;
import br.com.alura.loja.modelo.Cliente;
import br.com.alura.loja.modelo.ItemPedido;
import br.com.alura.loja.modelo.Pedido;
import br.com.alura.loja.modelo.Produto;
import br.com.alura.util.JPAUtil;

public class CadastroDePedido {
    
    public static void main(String[] args) {
        
        popularBancoDeDados();
        
        EntityManager em = JPAUtil.getEntityManager();
        ProdutoDao produtoDao = new ProdutoDao(em);
        ClienteDao clienteDao = new ClienteDao(em);
        
        Produto produto = produtoDao.buscarPorId(1l);
        Cliente cliente = clienteDao.buscarPorId(1l);
        
        em.getTransaction().begin();

        Pedido pedido = new Pedido(cliente);
        pedido.adicionarItem(new ItemPedido(10, pedido, produto));
        
        PedidoDao pedidoDao = new PedidoDao(em);
        pedidoDao.cadastrar(pedido);
        
        em.getTransaction().commit();

    }
    
    private static void popularBancoDeDados() {
        Categoria celulares = new Categoria("CELULARES");
        Produto celular = new Produto("Xiaomi Redmi Note 12", "Muito legal", new BigDecimal("1800"), celulares);
        
        Cliente cliente = new Cliente("Rodrigo", "123456");
        
        EntityManager em = JPAUtil.getEntityManager();
        ProdutoDao produtoDao = new ProdutoDao(em);
        CategoriaDao categoriaDao = new CategoriaDao(em);
        ClienteDao clienteDao = new ClienteDao(em);
        
        em.getTransaction().begin();
        
        categoriaDao.cadastrar(celulares);
        produtoDao.cadastrar(celular);
        clienteDao.cadastrar(cliente);
        
        em.getTransaction().commit();
        em.close();
    }
}

Persistence:

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.2"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="loja" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/loja?useTimezone=true;serverTimezone=UTC"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="Almeida@10"/>
            
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
            <property name="hibernate.show.sql" value="true"/>
            <property name="hibernate.fomart_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            
        </properties>
    </persistence-unit>
</persistence>

No persistence já está como 'update' porém mesmo assim não atualiza.

Print do MySQL

1 resposta

Olá, Beatriz! Tudo bem?

Peço desculpa pela demora em responder o seu tópico.

Isso pode estar acontecendo porque, a cada execução, você está criando um novo objeto Pedido e adicionando-o ao banco de dados.

A propriedade hibernate.hbm2ddl.auto como 'update' no arquivo de persistência significa que o Hibernate irá atualizar o esquema do banco de dados para refletir as entidades mapeadas, mas não irá afetar o comportamento das operações de inserção/atualização no nível dos dados.

Se você deseja atualizar um Pedido existente, você precisa primeiro buscar o Pedido existente, fazer as alterações necessárias e então salvar novamente. Por exemplo:

Pedido pedidoExistente = pedidoDao.buscarPorId(idDoPedidoExistente);
pedidoExistente.adicionarItem(new ItemPedido(10, pedidoExistente, produto));
pedidoDao.atualizar(pedidoExistente);

No código acima, idDoPedidoExistente seria o ID do Pedido que você deseja atualizar. Note que você precisaria ter um método atualizar no seu PedidoDao que poderia ser algo assim:

public void atualizar(Pedido pedido) {
    this.em.merge(pedido);
}

Os exemplos compartilhados acima são uma forma de implementação, se usá-las diretamente podem não funcionar, então realize alguns ajustes para funcionarem corretamente no seu ambiente.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.