1
resposta

Erro ao rodar a aplicação no Heroku

Olá a todos.

Ao acessar a página do meu projeto (https://cdcspringmvc-alura-maury.herokuapp.com/), ocorreu uma exception fazendo com que a página de erro fosse exibida ao invés da home. Como na página erro coloquei uma linha para imprimir a stack trace da exception, consegui ver que é alguma coisa em relação ao banco de dados, mas não entendi o que está causando o erro.

A stack trace que aparece no html é a seguinte:

Exception: org.hibernate.exception.SQLGrammarException: could not extract ResultSet

org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)

Não coloquei as demais linhas para o post não ficar gigante.

A minha classe JPAConfiguratio está assim:

@EnableTransactionManagement
public class JPAConfiguration {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, Properties aditionalProperties) {

        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        factoryBean.setJpaVendorAdapter(vendorAdapter);
        factoryBean.setDataSource(dataSource);
        factoryBean.setJpaProperties(aditionalProperties);
        factoryBean.setPackagesToScan("br.com.casadocodigo.loja.models");

        return factoryBean;
    }

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

    @Bean
    @Profile("dev")
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUsername("root");
        dataSource.setPassword("");
        dataSource.setUrl("jdbc:mysql://localhost/casadocodigo?useTimezone=true&serverTimezone=UTC&useUnicode=yes&characterEncoding=UTF-8");
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        return dataSource;
    }

    @Bean
    @Profile("dev")
    private Properties aditionalProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.hbm2ddl.auto", "update");
        return properties;
    }
}

A minha classe JPAProductionConfiguration está assim:

@Profile("prod")
public class JPAProductionConfiguration {

    @Autowired
    //org.springframework.core.env.Environment
    private Environment environment;

    @Bean
    public DataSource dataSource() throws URISyntaxException {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.postgresql.Driver");
        //usuario:senha@host:port/path
        //DATABASE_URL -> variável de ambiente que o Heroku fornece ao rodar o sistema
        URI dbUrl = new URI(environment.getProperty("DATABASE_URL"));

        dataSource.setUrl("jdbc:postgresql://"+dbUrl.getHost()+":"+dbUrl.getPort()+dbUrl.getPath());
        dataSource.setUsername(dbUrl.getUserInfo().split(":")[0]);
        dataSource.setPassword(dbUrl.getUserInfo().split(":")[1]);
        return dataSource;
    }

    @Bean
    private Properties aditionalProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.hbm2ddl.auto", "update");
        return properties;
    }
}

A minha classe ServletSpringMVC está assim:

public class ServletSpringMVC extends AbstractAnnotationConfigDispatcherServletInitializer{

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {SecurityConfiguration.class, 
                AppWebConfiguration.class, JPAConfiguration.class,
                JPAProductionConfiguration.class};
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] {};
    }
    @Override
    protected String[] getServletMappings() {
        return new String[] {"/"};
    }
    @Override
        protected Filter[] getServletFilters() {
        CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
        encodingFilter.setEncoding("UTF-8");
        return new Filter[] {encodingFilter, new OpenEntityManagerInViewFilter()};
    }

    @Override
    protected void customizeRegistration(Dynamic registration) {
            registration.setMultipartConfig(new MultipartConfigElement(""));
    }

    //Método necessário para dizer para o String MVC qual o profile que deve usar ao subir o servidor
    /*@Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
        servletContext.addListener(new RequestContextListener());
        servletContext.setInitParameter("spring.profiles.active", "dev");
    }*/
}

Eu revisei o meu projeto, mas não encontrei nada de errado. Provavelmente é um pequeno detalhe.

1 resposta

Oi Maury,

Qual é o model envolvido na transação? Me parece ser um problema com o @JoinColumn