1
resposta

Problema ao cadastrar os dados

Estou usando o banco de dados MySql, acredito que eu tenha feito tudo certo, mas quando eu executo a classe CadastroDeProduto os dados não são salvos da tabela do banco de dados, e o console não mostra nenhum erro: Insira aqui a descrição dessa imagem para ajudar na acessibilidadearquivo pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>br.com.alura</groupId>
  <artifactId>loja_JPA</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build>
      <plugins>
          <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
          <configuration>
              <release>11</release>
          </configuration>
          </plugin>
      </plugins>
  </build>
  <dependencies>

      <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-entitymanager</artifactId>
          <version>5.4.27.Final</version>
      </dependency>

      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>

  </dependencies>
</project>

persistence.xml:

<?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="lojadb" transaction-type="RESOURCE_LOCAL">
            <properties>
                <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/lojadb"/>
                <property name="javax.persistence.jdbc.user" value="root"/>
                <property name="javax.persistence.jdbc.password" value=""/>

                <property name="hibernate.hbm2ddl.auto" value="update" />
                   <property name="hibernate.show_sql" value="true" />
                   <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect" />
            </properties>
        </persistence-unit>
</persistence>

Produto.java:

package br.com.alura.loja.modelo;

import java.math.BigDecimal;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "produtos")
public class Produto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private String descricao;
    private BigDecimal preco;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public BigDecimal getPreco() {
        return preco;
    }

    public void setPreco(BigDecimal preco) {
        this.preco = preco;
    }
}

CadastroDeProduto.java:

package br.com.alura.loja.testes;

import java.math.BigDecimal;

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

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

public class CadastroDeProduto {

    public static void main(String[] args) {
        Produto celular = new Produto();
        celular.setNome("Xiaomi Redmi");
        celular.setDescricao("Muito Legal");
        celular.setPreco(new BigDecimal("800"));

        EntityManagerFactory factory = Persistence.createEntityManagerFactory("lojadb");
        EntityManager em = factory.createEntityManager();

        em.persist(celular);

    }

}

Desde já agradeço.

1 resposta

Fala Marcos, beleza?

Ao utilizar o RESOURCE_LOCAL, a responsibilidade de operar com as transações fica contigo.

Antes de iniciar uma sequência de operações no banco de dados, que juntas devam ser atômicas, deve-se iniciar uma transação.

Caso nenhuma das operações isoladamente tenha dado algum tipo de erro, devemos efetuar o commit. Só assim todas aquelas operações solicitadas entram em vigor.

Caso pelo menos 1 operação tenha dado erro, fazemos o rollback, para que todas as operações sejam canceladas/voltem ao estado anterior ao do comando.

Por fim, devemos fechar o entity manager.

entityManager.getTransaction().begin();  // Iniciando a transação
entityManager.persist(oObjetoASerPersistido); // Comando(os) que juntos devem ser atômicos
entityManager.getTransaction().commit(); // Tudo deu certo? Beleza, commit!
entityManager.close(); // Fechar o entity manager

Espero ter ajudado.