Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
10
respostas

Erro de transacao - HTTP Status 500 – Internal Server Error

Ao enviar o formulario da Aula II do curso, é apresentada a seguinte mensagem de erro:

Type Exception Report

Message Request processing 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

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

org.springframework.web.util.NestedServletException: Request processing 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
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

eu pensei que poderia ser pq diferente da aula, meu banco tem senha. Mas ainda sim, apos alterar e reiniciar o server nao fo.

O que pode ser?

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;

// A classe a seguir será a responsável por configurar o framework, passando informações relevantes como o banco a ser utilizado, seu usuário e senha, etc;
@EnableTransactionManagement // Anotação para o Spring gerenciar as transações para nós
public class JPAConfiguration {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        factoryBean.setJpaVendorAdapter(vendorAdapter);
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        // Passando informações do BD
        dataSource.setUsername("root");
        dataSource.setPassword("mudar123"); // modifique para a senha do seu banco
        dataSource.setUrl("jdbc:mysql://localhost:3306/casadocodigo");
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        factoryBean.setDataSource(dataSource);

        Properties props = new Properties();
        // Ver no console algumas questões sendo geradas do hibernate
        props.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        props.setProperty("hibernate.show_sql", "true");
        props.setProperty("hibernate.hbm2ddl.auto", "update");
        factoryBean.setJpaProperties(props);

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

        return factoryBean;

    }

    @Bean // a partir desse bean, o Spring fornecerá as transações para o EntityManager
    public JpaTransactionManager transactionManager(EntityManagerFactory emf) {
        return new JpaTransactionManager(emf);
    }

}
10 respostas

Seu código me parece ok.

As informações de conexão com o banco são essas mesmo? senha = mudar123, username = root, db = casadocodigo ?

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("");
        dataSource.setUrl("jdbc:mysql://localhost/casadocodigo");
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        factoryBean.setDataSource(dataSource);

        Properties properties = new Properties();
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.hbm2ddl.auto", "update");

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

        return factoryBean;
    }

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


}

Sim, eram essas mesmo. Eu até desinstalei o mysql. Sei la se é bug. Vou tentar instalar novamente e eu digo aqui para me ajudar.

Gente eu quero dar continuidade no curso, ninguem para me ajudar? Olha eu logando no mysql:

(PELO CMD)

C:\Users\ACER>mysql -h localhost -u root -p
Enter password: ****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 8.0.15 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

ps: ALTEREI A SENHA PARA root, E JA INFORMEI NO JPACONFIGURATION.

ALGUEM POR FAVOR ME AJUDA, QUERO DAR CONTINUIDADE NO MEUS ESTUDOS.

Message Request processing 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

erro que ta dando.

é apenas ao enviar o formulario.

Possivel motivo:

GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/casadocodigo] threw exception [Request processing 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] with root cause
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client

Alguem sabe o que pode ser?

solução!

Fala André,

Seguinte, o erro que você está tendo é porque você está tentando conectar num banco de dados MySQL 8 usando um driver JDBC do MySQL 5.

Você tem duas opções: 1) Instala o MySQL 5 e usa o driver atual 2) Utiliza a versão mais atual do driver e atualiza o hibernate.dialect.

Aqui tem o link do driver do MySQL 8 para você fazer o download: https://dev.mysql.com/downloads/connector/j/

e troque o

properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");

por

properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");

Abraço e bons estudos!

Otávio, quando eu coloquei a dependencia do MySql connector com o mysql 7

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

e tbm mudei a dialect que vc me disse, mas agora apresenta erro e nao consigo nem starta o servidor para teste (N abre nem o localhost)

to pensando em baixar o mysql 5 para ver se funciona kkk

erro:

mar 07, 2019 10:05:53 PM org.apache.catalina.core.StandardContext loadOnStartup
GRAVE: Servlet [dispatcher] in web application [/casadocodigo] threw load() exception
org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [org.hibernate.dialect.MySQL8Dialect] as strategy [org.hibernate.dialect.Dialect]

Sobe a versão da dependência do Hibernate pra pelo menos a 5.3.1.Final também

Otavio, eu achei mais facil voltar pro mysql 5.7.25

E depois de 60 minutos e um dia de estudo "perdido" (diria de aprendizado haha) e com a suas dicas eu consegui fazer funcionar.

MUITO obrigado meu amigo.

Que bom que deu certo

Abraço e bons estudos amigo! =)