1
resposta

Jpa não está criando as tabelas

Ao enviar o formulario, estou recebendo essa exceção:


Hibernate: insert into Produto (descricao, paginas, titulo) values (?, ?, ?)
abr 24, 2020 10:06:46 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/casadocodigo] threw exception [Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute statement] with root cause
java.sql.SQLSyntaxErrorException: Table 'casadocodigo.produto' doesn't exist

Classe de configuração do JPA

package br.com.casadocodigo.loja.conf;

import java.util.Properties;
import javax.persistence.EntityManagerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;


@EnableTransactionManagement
public class JPAConfiguration {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();


        factoryBean.setJpaVendorAdapter(vendorAdapter);

        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        dataSource.setUrl("jdbc:mysql://localhost:3306/casadocodigo?useTimezone=true&serverTimezone=America/Sao_Paulo");    
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");


        factoryBean.setDataSource(dataSource);

        Properties props = new Properties();
        props.setProperty("hibernate.dialect","org.hibernate.dialect.MySQL5InnoDBDialect");
        props.setProperty("hibernate.show_sql", "true");
        props.setProperty("hibernate.hdm2ddl.auto", "update");


        factoryBean.setJpaProperties(props);
        factoryBean.setPackagesToScan("br.com.casadocodigo.loja.models");


        return factoryBean;
    }

    @Bean
    public JpaTransactionManager transactionManager(EntityManagerFactory managerFactory    ) {
        return new JpaTransactionManager(managerFactory);
    }
}

Classe Produto



package br.com.casadocodigo.loja.models;

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



@Entity
public class Produto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String titulo;
    private String descricao;
    private Integer paginas;


    public String getTitulo() {
        return titulo;
    }
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    public int getPaginas() {
        return paginas;
    }
    public void setPaginas(Integer paginas) {
        this.paginas = paginas;
    }

    @Override
    public String toString() {
        return "Produto [titulo=" + titulo + ", descricao=" + descricao + ", paginas=" + paginas + "]";
    }

}

Classe de ProdutoDAO

package br.com.casadocodigo.loja.daos;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.casadocodigo.loja.models.Produto;


@Transactional
@Repository
public class ProdutoDAO {

    @PersistenceContext
    private EntityManager entityManager;


    public void gravar(Produto produto) {
        entityManager.persist(produto);
    }

}

tem algo que eu fiz que está diferente do que foi mostrado na aula, estou usando a versao 8 do connector do mysql, mas tentei usar com a versão 5 e acabou gerando outros erros, e quando eu resolvi eles, acabou mostrando a mesma exceção que de antes com a versão 8..

Tambem estou usando a versão 8 do mysql

1 resposta

Oi Vinicius

Você comentou que atualizou o driver do MySQL, mas a configuração ainda está usando do MySQL 5:

props.setProperty("hibernate.dialect","org.hibernate.dialect.MySQL5InnoDBDialect");

tenta atualizar para "org.hibernate.dialect.MySQL8Dialect"