7
respostas

Erro banco h2

Boa Noite,

eu criei o arquivo data.sql corretamente , porem, fica dando erro ao executar o meu programa.

segue o erro:

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "TOPICO" not found; SQL statement: insert into topico(titulo,mensagem,dataCriacao,status,autor,curso) values('Dúvida','Erro ao criar projeto','2019-05-05 18:00:00','NAO_RESPONDIDO','1','1') [42102-200] at org.h2.message.DbException.getJdbcSQLException(DbException.java:453) ~[h2-1.4.200.jar:1.4.200] at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200] at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.readTableOrView(Parser.java:7628) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.readTableOrView(Parser.java:7599) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parseInsert(Parser.java:1747) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parsePrepared(Parser.java:954) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parse(Parser.java:843) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parse(Parser.java:815) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.prepareCommand(Parser.java:738) ~[h2-1.4.200.jar:1.4.200] at org.h2.engine.Session.prepareLocal(Session.java:657) ~[h2-1.4.200.jar:1.4.200] at org.h2.engine.Session.prepareCommand(Session.java:595) ~[h2-1.4.200.jar:1.4.200] at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1235) ~[h2-1.4.200.jar:1.4.200] at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:212) ~[h2-1.4.200.jar:1.4.200] at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:201) ~[h2-1.4.200.jar:1.4.200] at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95) ~[HikariCP-3.4.3.jar:na] at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-3.4.3.jar:na] at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:601) ~[spring-jdbc-5.2.6.RELEASE.jar:5.2.6.RELEASE]

7 respostas

Confira se no seu arquivo application.properties tem essa propriedade, que indica ao Hibernate para criar as tabelas no banco de dados

spring.jpa.hibernate.ddl-auto=update

Olá Rodrigo, acabei de conferir e meu arquivo application.properties tem essa propriedade sim.

Brunno,

Coloca aqui o conteudo completo do seu arquivo application.properties.

Segue o código:

##datasource -> config datasource ou seja do BD para o spring
spring.datasource.driverClassName = org.h2.Driver
spring.datasource.url=jdbc:h2:mem:novo-projeto-alura-forum
spring.datasource.username=brunnop
spring.datasource.password=


##jpa
## o hibernate precisa saber qual sera o dialeto do BD
## aqui passamos uma classe do Hibernate que representa o dialeto do Banco de dados.
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
##hibernate criara o BD automaticamente e sempre que tiver uma alteraçao será 'puxado' das propriedade e atualize o BD
spring.jpa.hibernate.ddl-auto=update


##h2
##o spring tem um console do h2 ou uma interface do h2 que é acessado direto no navegador
spring.h2.console.enabled=true
##path ou endereço para acessar a interface de gerenciamento do h2 -> localhost:8080/h2-console
spring.h2.console.path=/h2-console

O arquivo está ok.

Coloca aqui agora o código completo da sua classe Topico.

Segue a classe Topico.java

package br.com.projetoalura.forumprojetoalura.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.ManyToMany;
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) /* O hibernate ira gravar o nome da constante do enum em vez da ordem de declaracao  */
    private StatusTopico status = StatusTopico.NAO_RESPONDIDO;
    @OneToMany /*Cardinalidade*/
    private Usuario autor;
    @ManyToOne
    private Curso curso;
    @OneToMany(mappedBy = "topico") //para nao ser tratado como um novo mapeamento
    private List<Resposta> respostas = new ArrayList<>();

    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;
    }

}

Oi Brunno,

No atributo autor está com a anotação @OneToMany, mas deveria ser @ManyToOne.

Talvez isso tenha dado problema para o Hibernate criar as tabelas.