Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Não executa o CriadorDeProduto

Ao subir o Tomcat, joga uma exception no primeiro insert da classe CriadorDeProdutos.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'criadorDeProdutos': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute statement

Não foi feita nenhuma alteração no código, baixei extrai e importei. E sim, verifiquei as propriedades da conexão.

4 respostas

Matheus poderia compartilhar o código, assim ficará mais fácil ajudá-lo.

Att.

package br.com.caelum;

import java.util.Properties;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
public class JpaConfigurator {

    @Bean
    public DataSource getDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost/projeto_jpa");
        dataSource.setUsername("root");
        dataSource.setPassword("");

        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean getEntityManagerFactory(DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();

        entityManagerFactory.setPackagesToScan("br.com.caelum");
        entityManagerFactory.setDataSource(dataSource);

        entityManagerFactory
                .setJpaVendorAdapter(new HibernateJpaVendorAdapter());

        Properties props = new Properties();

        props.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");
        props.setProperty("hibernate.show_sql", "true");
        props.setProperty("hibernate.hbm2ddl.auto", "create-drop");

        entityManagerFactory.setJpaProperties(props);
        return entityManagerFactory;
    }

    @Bean
    public JpaTransactionManager getTransactionManager(EntityManagerFactory emf) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);

        return transactionManager;
    }

}
package br.com.caelum;

import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;

import br.com.caelum.model.Categoria;
import br.com.caelum.model.Loja;
import br.com.caelum.model.Produto;

@Component
public class CriadorDeProdutos {

    @PersistenceContext
    private EntityManager em;

    @Autowired
    private JpaTransactionManager transactionManager;

    @PostConstruct
    public void init() {
        TransactionTemplate template = new TransactionTemplate(
                transactionManager);
        template.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {

                Loja casaDoCodigo = new Loja();
                casaDoCodigo.setNome("Casa do Código");

                em.persist(casaDoCodigo);

                Loja musicalAlegre = new Loja();
                musicalAlegre.setNome("Musical Alegre");

                em.persist(musicalAlegre);

                Categoria tecnologia = new Categoria("Tecnologia");
                em.persist(tecnologia);

                Categoria musica = new Categoria("Música");
                em.persist(musica);

                Produto cursoDeViolao = new Produto();
                cursoDeViolao.setNome("Curso de Violão");
                cursoDeViolao.setLoja(musicalAlegre);
                cursoDeViolao.setPreco(49.0);
                cursoDeViolao
                        .setDescricao("Estude com os melhores professores e aprenda no seu ritmo, sem sair de casa.");
                cursoDeViolao.adicionarCategorias(tecnologia, musica);
                cursoDeViolao
                        .setLinkDaFoto("https://pbs.twimg.com/profile_images/378800000825434860/12136ee913ed4f44860914d44650144e.png");

                em.persist(cursoDeViolao);

                Produto livroDeArquitetura = new Produto();
                livroDeArquitetura
                        .setNome("Introduçao a Arquitetura Java e Design de projetos com Java");
                livroDeArquitetura.setLoja(casaDoCodigo);
                livroDeArquitetura.setPreco(30.0);
                livroDeArquitetura.adicionarCategorias(tecnologia);
                livroDeArquitetura
                        .setDescricao("Neste livro, os autores, conhecidos especialistas da "
                                + " área, apresentam muitos tópicos que aparecem com frequência"
                                + " na plataforma Java, incluindo desde modelagem e design das "
                                + "classes, até detalhes importantes das tecnologias mais utilizadas."
                                + "  Sempre com uma visão técnica e prática capaz de elucidar muitas "
                                + "questões enfrentadas tanto pelo profissional iniciante quanto por "
                                + "aquele que está adquirindo mais experiência na plataforma.");

                livroDeArquitetura
                        .setLinkDaFoto("http://www.arquiteturajava.com.br/img/capa-livro.png");

                em.persist(livroDeArquitetura);

                Produto livroDeSpring = new Produto();
                livroDeSpring.setNome("Vire o jogo com Spring Framework");
                livroDeSpring.setLoja(casaDoCodigo);
                livroDeSpring.setPreco(30.0);
                livroDeSpring.adicionarCategorias(tecnologia);
                livroDeSpring
                        .setDescricao("Criado para simplificar o desenvolvimento de aplicações Java, "
                                + "o Spring se tornou um dos frameworks de mais destaque dentro desse grande ambiente.  "
                                + "Aprenda muito mais que o básico do Spring, desde o tradicional Container de Inversão "
                                + "de Controle e Injeção de Dependências, passando pelos robustos módulos de segurança, "
                                + "transações, programação orientada a aspectos e também o fantástico módulo MVC, o SpringMVC.");

                livroDeSpring
                        .setLinkDaFoto("http://cdn.shopify.com/s/files/1/0155/7645/products/spring-framework-featured_large.png?v=1411567960");

                em.persist(livroDeSpring);

                Produto violao = new Produto();
                violao.setNome("Violão");
                violao.setLoja(musicalAlegre);
                violao.setDescricao("Excelente violão");
                violao.setPreco(500.0);
                violao.adicionarCategorias(musica);
                violao.setLinkDaFoto("http://www.marillac.g12.br/imgs/atividade%20complementar/violao.jpg");

                em.persist(violao);

                Produto flauta = new Produto();
                flauta.setNome("Flauta Doce");
                flauta.setLoja(musicalAlegre);
                flauta.setDescricao("Flauta doce");
                flauta.setPreco(300.0);
                flauta.adicionarCategorias(musica);
                flauta.setLinkDaFoto("http://i.mlcdn.com.br/1500x1500/flauta-doce-germanicayamaha-yrs-23g-204013000.jpg");

                em.persist(flauta);

            }
        });
    }

}
solução!

Matheus quando vc injetar com @Autowired o CriadorDeProduto em outro componente, então o código será chamado.

Outra abordagem é na inicialização da aplicação, por exemplo como o código abaixo:

@SpringBootApplication
@EnableJpaAuditing
public class Application {

    private final Log logger = LogFactory.getLog(this.getClass());

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    CommandLineRunner init(UsuarioService usuarioService, PessoaService pessoaService, NivelAcessoService nivelAcessoService,
                           GrupoGastoService grupoGastoService, SubGrupoGastoService subGrupoGastoService,
                           StatusConvenioService statusConvenioService) {
        return args -> {
            initNiveisAcessos(nivelAcessoService);
            initUsuarioAdmin(usuarioService, pessoaService, nivelAcessoService);
            initGrupoSubgrupo(grupoGastoService, subGrupoGastoService);
            initStatusConvenio(statusConvenioService);
        };
    }

Neste exemplo de código, Aplication é a classe de inicialização da aplicação. Qdo o Spring for executar Application o método init será acionado, e nele eu faço diversas inicializações.

Espero que ajude.

Att.