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

Erro ao executar o TomCat

Pessoal estou recebendo algumas exceções ao executar o projeto-jpa-2 pelo tomcat:

GRAVE: Exceção ao enviar evento de contexto iniciado para instância listener da classe [org.springframework.web.context.ContextLoaderListener] org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'criadorDeProdutos': Invocation of init method failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Could not open connection

Alguém consegue me ajudar?

23 respostas

Olá Guilherme,

Visitei todos os topicos mas a situação ainda continua. Eu estou no curso Java e JPA: Otimizações com JPA e HIbernate. Quando eu baixo o arquivo do instrutor e tento executar acontecem todas essas exceções. Ja mudei a senha do usuario root do MySQL para a que eu uso e mesmo assim acontece isso

Olá Lucas, também tenho o mesmo problema, já pesquisei nos tópicos acima e nada solucionado.

Pois é Ricardo. Isso é extremamente ruim porque fico impossibilitado de seguir com o curso Acredito que por ser uma situação recorrente o curso deveria ser atualizado

Concordo com você sobre a atualização do curso, estamos fazendo um treinamento aqui na empresa com o respectivo curso, e todos estão tendo problemas com essa parte de executar os arquivos do projeto. Sendo que não somos os únicos e a um histórico no fórum de alunos que estão com problemas semelhantes, nada mais justo simplesmente atualizarem os arquivos do projeto, ou simplesmente gravarem uma aula de como executar tudo sem nenhum erro.

Infelizmente essa situação revela um descaso para conosco, alunos que estamos aqui para aprender e não temos o respaldo mínimo para que consigamos atingir nosso objetivo. Não adianta nada dizer que tem "mil cursos" se não nos dão cursos atualizados ou nos fornecem materiais que "não funcionam", eu tinha uma alta expectativa com relação aos treinamentos pois o conceito da Caelum é dos mais altos, mas a decepção esta sendo enorme.

Olá Lucas!

Consegui simular o seu erro na minha maquina ao inserir a senha incorreta na classe JpaConfigurator -> linha 27:

 dataSource.setPassword("senha-incorreta");

Como você disse que já mexeu nessa parte e o erro continua deduzo que seja algum problema com o usuário root do seu banco de dados. Provavelmente o root precisa de uma permissão de superusuário (a nível de terminal conseguimos contornar isso usando o sudo na frente de um comando SQL, mas na aplicação precisamos do acesso e provavelmente ele não está sendo concedido).

Podemos tentar resolver isso de duas formas:

1 - Resetar a senha do root

2 - Criar um novo usuário

Veja em detalhes abaixo:

RESETAR A SENHA DO ROOT

Para resetar a senha precisamos, como dito acima, utilizar o comando sudo para poder entrar no console do MySQL:

sudo mysql -u root

Depois disso, vamos selecionar a database mysql:

use mysql;

Agora podemos resetar a senha do root através do seguinte comando:

update user set plugin='mysql_native_password' where User='root';

E para atualizar a tabela de privilégios:

flush privileges;

Com isso feito, você pode digitar quit e sair do terminal MySQL.

Agora tente rodar o comando sem o sudo na frente:

mysql -u root

Caso funcione, nossa alteração teve sucesso!

Agora basta reiniciar sua aplicação e ver se ela roda conforme o esperado.

CRIAR UM NOVO USUÁRIO

Para criar um novo usuário podemos fazer da seguinte forma:

sudo mysql -u root

Depois:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'user_password';

Para dar todos os privilégios (CREATE, DROP, UPDATE, DELETE, INSERT e SELECT):

GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';

Atualize a tabela de privilégios:

flush privileges;

Digite quit para sair e depois entre com seu novo usuário:

mysql -u newuser -p

Aperta ENTER, insira a senha e faça os comandos MySQL pedidos na aula para criar as tabelas:

create database projeto_jpa;
use projeto_jpa;
show tables;

Agora na sua aplicação, na classe JpaConfigurator troque os campos para acesso ao banco de dados:

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

Reinicie a aplicação e veja se funciona!

Espero que tenha ajudado, caso não tenha funcionado peço para que me mande o máximo de informações que puder para que eu possa te ajudar como por exemplo prints de tela ou logs de aplicação.

Caso ache necessário, pode postar o código no GitHub também mas já adianto que esse problema não me parece ser no código.

Aguardo seu retorno!

Boa tarde Guilherme,

No meu caso acredito que não seja problema de permissões do usuário já que eu consigo acessar as funções do sql sem utilizar o comando ‘sudo’ E estou conseguindo acessar normalmente o banco quando faço a configuração utilizando o arquivo persistente.xml Comecei a ter problemas quando iniciei o curso 2 de jpa

Certo Lucas, vou precisar de uma análise maior desse problema.

Poderia me mandar seu projeto por favor?

Para fazer isso no Eclipse você pode ir em File > Export > General > Archive File > Clica em Browser > De um nome ao arquivo zip que será gerado > OK > Finish

Hospeda esse Zip em algum lugar de sua preferência como o Google Drive ou Dropbox e me manda a URL por favor.

Guilherme,

Segue o link do projeto https://drive.google.com/file/d/1IkVlxqOdTuum2dIkSbt_56WgDowHHsjj/view?usp=sharing

Eu ja havia instalado em minha maquina a versão 8.0.16 do conector java do MySQL e depois baixei a versão 5.1.35 que é a utilizada pelo instrutor do vídeo.

Abaixo está o arquivo persistence.xml que eu utilizei no primeiro curso de JPA e que está funcionando e realizando a conexão com o banco de dados:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">
    <!-- unidade de persistencia com o nome financas -->
    <persistence-unit name="financas">
        <!-- Implementa��o do JPA, no nosso caso Hibernate -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!-- Aqui s�o listadas todas as entidades -->
        <class>br.com.caelum.financas.modelo.Conta</class>
        <class>br.com.caelum.financas.modelo.Movimentacao</class>
        <properties>
            <!-- Propriedades JDBC -->
            <property name="javax.persistence.jdbc.driver"
                value="com.mysql.cj.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url"
                value="jdbc:mysql://localhost/financas?useTimezone=true&serverTimezone=UTC" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="minha senha" />
            <!-- Configura��es espec�ficas do Hibernate -->
            <property name="hibernate.dialect"
                value="org.hibernate.dialect.MySQL5InnoDBDialect" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

Olá Lucas, testei seu projeto em minha maquina.

Como você tinha configurado uma senha no seu usuário (e essa senha não é a mesma que a minha) ele deu o mesmo erro apresentado por você.

Logo o problema está na configuração mesmo e não no código.

Recomendo fortemente que você faça o procedimento "RESETAR A SENHA DO ROOT" que citei acima.

Esse procedimento não só tira o fato de você precisar usar o sudo, ele realmente reseta a senha do seu usuario no banco de dados.

Após ter feito o reset mude seu JPAConfigurator para usar a senha nativa (vazia):

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

Tenta fazer dessa forma por favor.

Aguardo seu retorno!

Guilherme, estou enfrentando o mesmo erro que o Lucas, no meu caso não é problema de senha pois esta senha é usada no Command Line do MySQL e está funcionando normalmente.

Então Guilherme, mesmo sabendo que o problema não era esse eu segui todos os passos que você sugeriu. E criei um novo usuário para usar no projeto de acordo com oq vc também sugeriu é mesmo assim não deu certo. Como está acontecendo com mais pessoas acredito que não seja algo tão simples assim como uma senha errada. Na sua máquina você utiliza qual versão do conector Java do MySQL?

Lucas, eu estava com o mesmo problema e resolvi com as modificações no pom.xml (relativo às dependências do Maven) e na classe JpaConfigurator (relativo aos parâmetros do driver e da conexão).

Estou usando a versão mais nova de banco mysql (8.0.16), bem como do driver (8.0.16).

Para o pom.xml, você deve substituir o conteúdo do original (na pasta raiz do seu projeto). No Eclipse, clique com o botão direito em cima do seu projeto, opção Maven, subopção Update Project. Sugiro marcar o checkbox Force Update of Snapshots/Releases, concluir a atualização das dependências.

Segue o pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>br.com.caelum</groupId>
    <artifactId>projeto-jpa-2</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>Projeto JPA 2</name>
    <url>http://maven.apache.org</url>

    <properties>
        <spring.version>5.1.5.RELEASE</spring.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>

    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.16.Final</version>
    </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>

        <!-- <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> 
            <version>2.6.9</version> </dependency> -->

        <!-- Hibernate EHCache API -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-ehcache</artifactId>
            <version>5.4.3.Final</version>
        </dependency>
        <!-- EHCache uses slf4j for logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>

        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>

    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>5.4.2.Final</version>
      <scope>runtime</scope>
    </dependency>

        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>projeto-jpa-2</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

No arquivo JpaConfigurator realizei as seguintes modificações:

//getDataSource()
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");//o outro está deprecated
dataSource.setUrl("jdbc:mysql://localhost/projetojpa?useSSL=false&serverTimezone=UTC");//não precisei indicar a porta já que é a padrão

// getEntityManagerFactory()
props.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");//Em substituição ao dialeto da versão 5

Se você seguir as instruções e ainda assim não obtiver êxito, dê um retorno para que possamos analisar. Ah, e verifique os Logs, para ver se houve progresso. []s

RAlves

Bom dia, a alteração no arq JPAconfigurator gerou este erro: Unable to resolve name [org.hibernate.dialect.MySQL8Dialect] as strategy [org.hibernate.dialect.Dialect]

Lucas, o erro que eu tinha ao executar o tomcat foi solucionado, porém infelizmente não consigo te explicar o porque, um colega meu de trabalho me passou os arquivos de configuração que ele corrigiu para fazer o curso, e ao substituir eles simplesmente começou a funcionar. Se quiser posso salvar no github ou colar o fonte dos dois arquivos aqui, o que ficar mais fácil. Basicamente foi substituir o pom.xml e o JpaConfigurator

Rogério,

Muito obrigado pelo retorno. Só conseguirei testar a noite mas aviso se obtiver progresso

Thiago,

Pode por favor colocar o conteúdo fonte dos Arquivos aqui no fórum mesmo

Rogerio,

Fiz os testes mas não consegui rodar o projeto.

Agora está aparecendo os seguintes avisos no meu console:

Hibernate: alter table Produto drop foreign key FKbsrs2q7ixb8srg7d0nfys9s5e
[main] WARN org.springframework.web.context.support.AnnotationConfigWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getEntityManagerFactory' defined in class path resource [br/com/caelum/JpaConfigurator.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.SQLGrammarException: Unable to open JDBC Connection for DDL execution
[main] ERROR org.springframework.web.context.ContextLoader - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getEntityManagerFactory' defined in class path resource [br/com/caelum/JpaConfigurator.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.SQLGrammarException: Unable to open JDBC Connection for DDL execution
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1762)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:400)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:291)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4666)

A classe JPAConfigurator está assim:

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.cj.jdbc.Driver");//o outro está deprecated
        dataSource.setUrl("jdbc:mysql://localhost/projetojpa?useSSL=false&serverTimezone=UTC");//não precisei indicar a porta já que é a padrão
        dataSource.setUsername("newuser");
        dataSource.setPassword("user_password");

        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.MySQL8Dialect");//Em substituição ao dialeto da versão 5
        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;
    }

}
solução!

Lucas, aparentemente as modificações que você fez na classe estariam OK, desde que:

  1. O nome de usuário que você está usando já foi criado e tem o nome e senha como descritos nos campos:
        dataSource.setUsername("newuser"); //Lembre-se também de dar permissões totais para este usuário, como já descrito neste post.
        dataSource.setPassword("user_password");
  1. Que você deu permissões adequadas para o usuário criado ("newuser"), permitindo a criação das tabelas (Grant)
  2. Que você criou um banco de dados com o nome "projetojpa", assim como eu fiz, sem underline. (E recomendo que faça isso utilizando as credenciais do "newuser", isto é, saia do mysql e logue novamente com as credenciais do novo usuário.)
  3. Que você está usando as versões mais novas tanto do banco de dados quanto do conector JDBC do MySQL. Recomendo que remova do projeto qualquer referência a versões anteriores (<8), para não haver confusão de bibliotecas. Por falar em bibliotecas, fez os passos do Maven que sugeri? Tive vários problemas antes de conseguir, que tinham relação com versões desatualizadas do Spring, Hibernate e etc. Recomendo fortemente que se não fez, que faça.

Se continuar com erros, peço que mande completo, por favor.

RAlves

Ricardo de Bruyn, Não dá para saber direito o que aconteceu no seu caso. Peço que siga as instruções que passei para o Lucas. Vai um resumo: Instale as versões de mysql e conector mais recentes. Crie novo usuário e dê permissões para ele. Saia do mysql e logue com o novo usuário. Crie seu banco de dados vazio, entre nele e execute show tables ( tudo isso na linha de comando). Remova do Buildpath do seu projeto qualquer versão anterior do MySQL. Atualize seu POM.XML com o que enviei. Proceda com a atualização do projeto no MAVEN. Atualize seu JpaConfigurator para utilizar o novo usuário, senha, database (string de conexão) classname e dialeto. Reinicie seu servidor Tomcat e então verifique se deu erros. Depois de tudo isso, se der erro, posta aqui de novo?

Para me certificar que o problema está basicamente no pom.xml e no JpaConfigurator, excluí meu projeto, baixei um novo projeto, substituí o pom.xml (pelo que mostrei lá em cima), atualizei as bibliotecas pelo maven no eclipse e atualizei o JpaConfigurator com os parâmetros da minha conexão, configurando as versões mais novas de banco/conector/dialeto. Rodou de primeira...

RAlves

Consegui resolver o problema : org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'criadorDeProdutos': ...

Alterando a versão do conector do mysql para 8.0.16

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
</dependency>

E trocando a JRE 1.7 para a versão que eu estou usando (11).

Remover o JRE atual do projeto:

Botão mouse direito no projeto -> Build Path -> Configure Build Path... ->  (Aba Libraries)  Selecione sua JRE e depois remova;

Adicionar o JRE do Sistema :

(Mesma tela onde removeu a JRE) Add Library... -> Selecione JRE System Library -> Next -> Finish;

Rogerio,

Ao criar o banco com o nome "projetojpa" deu certo e agora o projeto está funcionando. Obrigado pelo help!!