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

ERRO 500 - Error creating bean with name 'entityManagerFactory' defined in br.com.lcasadocodigo.loja.conf.JPAConfiguration

Criei minha dúvida no GIST: https://gist.github.com/DanFonseca/8f4aa80d02d9ac013929b54167c82980

Poderiam me ajudar?

5 respostas

Amigo, parece que as classes não estão todas mapeadas. Notei que o nome do pacote está br.com.lcasadocodigo.loja.conf, esse L faz parte do pacote mesmo?

Posta a classe de configuração da JPA pra gente dar uma olhada. Abraço

Olá, Thiago, tudo bem?

Segue a classe de configuração JPA

package br.com.lcasadocodigo.loja.conf;
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;
import javax.persistence.EntityManagerFactory;
import java.util.Properties;

@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("root");
        dataSource.setUrl("jdbc:mysql://localhost:3306/casadocodigo?useTimezone=true&serverTimezone=UTC");
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");

        factoryBean.setJtaDataSource(dataSource);

        Properties props = new Properties();
        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.lcasadocodigo.loja.DAO");

        return factoryBean;
    }

    @Bean
    public JpaTransactionManager transactionManager (EntityManagerFactory emf){
        System.out.println("aaaaaaa");
        return new JpaTransactionManager(emf);
    }
}

Estou mapeando a classe JPAConfiguration na servletSpringMVC

public class ServletSpringMVC extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        System.out.println("iniciando getRootConfigClasses");
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        System.out.println("iniciando getServletConfigClasses");
        return new Class[] {AppWebConfiguration.class, JPAConfiguration.class};
    }

    //Este método informa qual URL o Spring deve mapear
    @Override
    protected String[] getServletMappings() {
        System.out.println("iniciando getServletMappings");
        return new String [] {"/"};
    }
}

Segue também a classe appWebConfiguration e a DAO.

package br.com.lcasadocodigo.loja.conf;

import br.com.lcasadocodigo.loja.DAO.ProdutoDAO;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import br.com.lcasadocodigo.loja.controllers.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@EnableWebMvc
@ComponentScan(basePackageClasses = {PagesController.class, ProdutoDAO.class})

public class AppWebConfiguration {

    @Bean
    public InternalResourceViewResolver internalResourceViewResolver (){
        System.out.println("iniciando view");
        InternalResourceViewResolver resolver = new  InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");

        return resolver;
    }

}

DAO

package br.com.lcasadocodigo.loja.DAO;

import br.com.lcasadocodigo.loja.models.Produto;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

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

@Repository
@Transactional
public class ProdutoDAO {

    //Criando um gerenciado de entidade
    @PersistenceContext
    private EntityManager manager;

    public void gravar (Produto produto){
        manager.persist(produto);
    }


}
solução!

Esse erro "NoJtaPlatform" indica que você não configurou seu hibernate.transaction.jta.platform corretamente. No Spring Boot, isso deve ser definido pelo JPAConfiguration.

Seu erro foi utilizar:

factoryBean.setJtaDataSource(dataSource);

o correto é:

factoryBean.setDataSource(dataSource);

Abraço!

Muito obrigado!!!