2
respostas

Não gera o id sequêncial quando cria o insert

Olá, verifiquei o código e revi as aulas mas não encontro o problema.

ERROR: NULL not allowed for column "ID"; SQL statement:
insert into produtos (id, descricao, nome, preco) values (null, ?, ?, ?) [23502-220]
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
package br.com.alura.loja.modelo;

import javax.persistence.*;
import java.math.BigDecimal;

@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;
    }
}
package br.com.alura.loja.testes;

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

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import java.math.BigDecimal;

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("loja");

        EntityManager em = factory.createEntityManager();

        em.getTransaction().begin();
        em.persist(celular);
        em.getTransaction().commit();
        em.close();
    }

}
<?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">
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:loja"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>

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

</persistence>
2 respostas

Olá! Como vai?

Conforme informado na mensagem de erro, parece que o problema está relacionado à geração do ID para a entidade Produto, então, vamos verificar alguns pontos que podem estar causando isso:

  1. Configuração do @GeneratedValue: Você está usando GenerationType.IDENTITY, que é uma estratégia de geração de chave primária onde o banco de dados é responsável por gerar o valor do ID. Certifique-se de que o banco de dados H2 está configurado para suportar essa estratégia. No caso do H2, isso geralmente funciona bem, mas é importante garantir que a tabela esteja configurada corretamente para aceitar valores gerados automaticamente.

  2. Propriedade hibernate.hbm2ddl.auto: No seu persistence.xml, você tem duas vezes a propriedade hibernate.hbm2ddl.auto, uma com valor "true" e outra com "update". Remova a linha com "true", pois ela não é um valor válido para essa propriedade. Mantenha apenas a linha com "update".

  3. Recriação do Banco de Dados: Como uma tentativa de solução, você pode tentar alterar temporariamente o valor de hibernate.hbm2ddl.auto para "create" para garantir que a tabela seja recriada do zero. Lembre-se de que isso apagará todos os dados existentes, então use com cuidado.

Espero que essas dicas ajudem a resolver o problema, mas caso não resolva peço que compartilhe todo o seu projeto para que eu possa fazer testes para identificar o problema. Envie usando o GitHub ou Drive do Google.

Bons estudos!

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

Armano, resolvido. Obrigado!