3
respostas

java.sql.SQLSyntaxErrorException: Table 'casadocodigo.produto' doesn't exist

Olá estou encontrando o seguinte erro:

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

Minha JPAConfiguration:

package br.com.casadocodigo.loja.config;

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;

//a anotação @EnableTransactionManagement. Assim o Spring ativa o gerenciamento de transações e já reconhece o TransactionManager.
@EnableTransactionManagement
public class JPAConfiguration {

    @Bean
    private LocalContainerEntityManagerFactoryBean entityManagerFactory() {

//        Informo ao Spring sobre o entityManager para assim depois de instancialo configurar qual o banco e suas propriedades.
        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();        
        JpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();        
        factoryBean.setJpaVendorAdapter(jpaVendorAdapter);

//        O driverManagerDataSource serve para informa qual o banco e suas configurações.
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();

        driverManagerDataSource.setUsername("root");
        driverManagerDataSource.setPassword("12345");
        driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/casadocodigo?useTimezone=true&serverTimezone=UTC");
        driverManagerDataSource.setDriverClassName("com.mysql.jdbc.Driver");

//        Informo ao entityManager qual as informações do banco serão configuradas para o spring.
        factoryBean.setDataSource(driverManagerDataSource);

//        Instanciando o properties para configurações opcionais do banco.
        Properties properties = new Properties();

        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");//Qual o dialeto do banco (Linguagen do MySQL).
        properties.setProperty("hibernate.show_sql", "true");//Posso ver quais estruturas de sql são realizadas no console.
        properties.setProperty("hibernate.hbm2ddl.auto", "update");//O tipo de manuseio do banco, update faz com que o Spring tome todas as precauções sobre as entidades, mantendo-as atualizadas.

//        Informo ao entityManer qual as propriedades extras que quero trabalhar.
        factoryBean.setJpaProperties(properties);

//        Informo ao entityManager o caminho das entidades que serão persistidas no banco.
        factoryBean.setPackagesToScan("br.com.casadocodigo.loja.models");

        return factoryBean;
    }

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

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;

//Informo ao spring que essa classe será um repositorio de uma entidade no nosso caso da entidade produto.
//Agora precisamos definir que o nosso ProdutoDAO é uma classe Transancional e fazemos isso através da anotação @Transactional do pacote org.springframework.transaction.annotation.Transactional.
@Repository
@Transactional
public class ProdutoDAO {

//    Instancio o entityManager como um atributo da classe para manipular a entidade em questão que no nosso caso é produto.
    @PersistenceContext
    private EntityManager manager;

//    Uso o atributo para persistir no banco a entidade produto.
    public void gravar(Produto produto) {
        manager.persist(produto);
    }
}
3 respostas

Para criar as tabelas, use:

properties.setProperty("hibernate.hbm2ddl.auto", "create");

E pq o professor consegue usar update? O create tbm manipula as tabelas automaticamente?

hibernate.hbm2ddl.auto

De acordo com a documentação, pode ter quatro valores válidos:

create | update | validate | create-drop

create : - cria o schema, os dados anteriormente presentes (se houver) no schema são perdidos update: - atualiza o schema com os valores fornecidos. validate : - valida o schema. Não faz nenhuma alteração no banco de dados. create-drop: - cria o schema destruindo os dados anteriormente presentes (se houver). Ele também descarta o schema do banco de dados quando o SessionFactory é fechado.

Em caso de atualização, se o schema não estiver presente no banco de dados, o schema será criado. Em caso de validação, se o schema não existir no DB, ele não será criado. Em vez disso, lançará um erro: -Table not found:

No caso de create-drope, o schema não é descartado ao fechar a sessão. Apenas cai ao fechar o SessionFactory.

Se o schema não estiver presente no banco de dados: - Ele cria o schema Se o schema estiver presente no banco de dados: - atualize o schema .