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

"Could not open JPA EntityManager for transaction"

Após configurar o Transaction e criar o banco de dados apresenta o erro "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"

package org.musify.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:3306/musify");
        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("org.musify.models");

        return factoryBean;
    }

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


}

//APP web

package org.musify.conf;

import org.musify.controllers.HomeController;
import org.musify.dao.ArtistaDAO;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@EnableWebMvc
@ComponentScan(basePackageClasses={HomeController.class, ArtistaDAO.class})
public class AppWebConfiguration {

    @Bean
    public InternalResourceViewResolver internalResourceViewResolver () {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

package org.musify.dao;

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

import org.musify.models.Artista;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
@Transactional

//ArtistasDAO
public class ArtistaDAO {

    @PersistenceContext
    private EntityManager manager;

    public void gravar(Artista artista)
    { 
        manager.persist(artista);
    }
}
9 respostas

Bom da Samantha, quando for usar annotation evita pular linhas, deixa as anotações grudadas com a linha que quer anotar:

@Repository
@Transactional
public class ArtistaDAO {

Bom dia Guilherme, obrigada pela dica. Já arrumei nessa classe, mas infelizmente ainda não funciona.

Olá Samantha, estive analisando melhor a exceção e pode ser que esse tópico te ajude: https://cursos.alura.com.br/forum/topico-erro-na-transaction-57299

Oi Clovis, obrigada pela ajuda. Eu revi todas as configurações de banco, url e consegui faze rum teste de conexão desde o eclipse para o banco e essa parte tá ok. Já na aplicação, ele exibe os dados preenchidos, mas ainda informa o erro:

"Artista [name=Enrique Iglesias, year=38, styles=POP, members=Enrique Iglesias, related=Julio Iglesias] nov 18, 2018 4:17:55 PM org.apache.catalina.core.StandardWrapperValve invoke GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/musify] 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"

A versão do MySQL que está utilizando pode funcionar para algumas coisas... Tente alternar entre outras versões

Samantha, tenta da um clear no projeto e um clean no tomcat e depois roda de novo

Oi meninos, eu removi a versão 8 do MySQL e instalei a 5 conforme sugestão, pela aplicação ele pinga no banco, mas não roda, o erro é o mesmo. INFORMAÇÕES: Server startup in 4454 ms Artista [name=Enrique, year=38, styles=POP, members=Enrique, related=Julio Iglesias] nov 18, 2018 5:56:25 PM org.apache.catalina.core.StandardWrapperValve invoke GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/musify] 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.GenericJDBCException: Could not open connection] with root cause java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)

solução!

Eu consegui fazer funcionar, nesse caso, eu tive que informar a senha do banco de dados na classe JPA: dataSource.setPassword("root");. Aí funcionou, não é uma boa p´ratica, mas para dar seguimento ao curso me ajudou. Obrigada a todos pela atenção!!!

Acredito que poderia ter passado o password como: null também Que bom que conseguiu :D