4
respostas

Erro 500 no POST

Alguém pode me ajudar com esse erro ao tentar persitir na tabela TOPICO? O @Id @GeneratedValue(strategy = GenerationType.IDENTITY) não está gerando o ID para poder inserir o novo registro em TOPICO

ERRO:

2021-12-13 23:16:18.663  WARN 6547 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 23502, SQLState: 23502
2021-12-13 23:16:18.664 ERROR 6547 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : NULL not allowed for column "ID"; SQL statement:
insert into topico (id, autor_id, curso_id, data_criacao, mensagem, status, titulo) values (null, ?, ?, ?, ?, ?, ?) [23502-202]
2021-12-13 23:16:18.670 ERROR 6547 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause

org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "ID"; SQL statement:
insert into topico (id, autor_id, curso_id, data_criacao, mensagem, status, titulo) values (null, ?, ?, ?, ?, ?, ?) [23502-202]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:508) ~[h2-2.0.202.jar:2.0.202]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) ~[h2-2.0.202.jar:2.0.202]
        at org.h2.message.DbException.get(DbException.java:223) ~[h2-2.0.202.jar:2.0.202]
        at org.h2.message.DbException.get(DbException.java:199) ~[h2-2.0.202.jar:2.0.202]
        at org.h2.table.Column.validateConvertUpdateSequence(Column.java:365) ~[h2-2.0.202.jar:2.0.202]
        at org.h2.table.Table.convertInsertRow(Table.java:931) ~[h2-2.0.202.jar:2.0.202]
        at org.h2.command.dml.Insert.insertRows(Insert.java:167) ~[h2-2.0.202.jar:2.0.202]
        at org.h2.command.dml.Insert.update(Insert.java:135) ~[h2-2.0.202.jar:2.0.202]
        at org.h2.command.CommandContainer.executeUpdateWithGeneratedKeys(CommandContainer.java:246) ~[h2-2.0.202.jar:2.0.202]
        at org.h2.command.CommandContainer.update(CommandContainer.java:167) ~[h2-2.0.202.jar:2.0.202]
        at org.h2.command.Command.executeUpdate(Command.java:247) ~[h2-2.0.202.jar:2.0.202]
        at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:209) ~[h2-2.0.202.jar:2.0.202]
        at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:169) ~[h2-2.0.202.jar:2.0.202]
        at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) ~[HikariCP-4.0.3.jar:na]
        at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) ~[HikariCP-4.0.3.jar:na]
4 respostas

Oi Saulo,

Posta aqui a sua classe Topico completa e também o seu arquivo application.properties.

Oi Rodrigo,

Segue...

package br.com.alura.forum.modelo;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

@Entity
public class Topico {

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String titulo;
    private String mensagem;
    private LocalDateTime dataCriacao = LocalDateTime.now();
    @Enumerated(EnumType.STRING)
    private StatusTopico status = StatusTopico.NAO_RESPONDIDO;
    @ManyToOne
    private Usuario autor;
    @ManyToOne
    private Curso curso;
    @OneToMany(mappedBy = "topico")
    private List<Resposta> respostas = new ArrayList<>();

    public Topico(){}

    public Topico(String titulo, String mensagem, Curso curso) {
        this.titulo = titulo;
        this.mensagem = mensagem;
        this.curso = curso;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Topico other = (Topico) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

    public Long getId() {
        return id;
    }

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

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

    public LocalDateTime getDataCriacao() {
        return dataCriacao;
    }

    public void setDataCriacao(LocalDateTime dataCriacao) {
        this.dataCriacao = dataCriacao;
    }

    public StatusTopico getStatus() {
        return status;
    }

    public void setStatus(StatusTopico status) {
        this.status = status;
    }

    public Usuario getAutor() {
        return autor;
    }

    public void setAutor(Usuario autor) {
        this.autor = autor;
    }

    public Curso getCurso() {
        return curso;
    }

    public void setCurso(Curso curso) {
        this.curso = curso;
    }

    public List<Resposta> getRespostas() {
        return respostas;
    }

    public void setRespostas(List<Resposta> respostas) {
        this.respostas = respostas;
    }

}


application.properties
# datasource
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:alura-forum
spring.datasource.username=sa
spring.datasource.password=

# jpa
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.defer-datasource-initialization=true

# h2
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

Está tudo certinho.

Esse erro geralmente ocorre quando a anotação @GeneratedValue está com o valor AUTO ao invés de IDENTITY. O seu estava assim antes?

Tenta parar o servidor e dar um clean no projeto(menu superior: Project -> Clean e depois botão direito no projeto: Maven -> Update Project) e rodar novamente para ver se resolve.

Obs: verifica também se no menu superior Project a opção Build Automatically está marcada.

Desde o início estava como IDENTITY porém como o problema persistia eu chguei a alterar para AUTO, SEQUENCE e até mesmo TABLE porém quando alterei o mavem não conseguia nem buildar o projeto dando o mesmo erro acima e por fim não fazendo os inserts constante no Data.sql . A aplicação não funcionava. Outro detelhe é que estou desenvolvendo no VSCode. Vou tentar buscar uma outra solução :/