1
resposta

Sintaxe SQL fora do padrão do Postgre

Olá pessoal. Fiz o deploy no Heroku, o build rodou com sucesso mas estou tendo problema na criação das tabelas pelo Hibernate.

Inclui este parametro na JPAConfiguration e também na JPAProductionConfiguration para conseguir ver os comandos DDL na log:

props.setProperty("org.hibernate.tool.hbm2ddl", "debug");

Também coloquei alguns prints para ter certeza de que estava passando nos métodos de configuração da JPA de produção:

@Bean
    public Properties additionalProperties() {
        System.out.println("DEBUG#PASSEI NO addProps");
        Properties props = new Properties();
        props.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
        props.setProperty("hibernate.show_sql", "true");


        props.setProperty("hibernate.hbm2ddl.auto", "create");
        props.setProperty("org.hibernate.tool.hbm2ddl", "debug");

        return props;
    }

    @Bean
    public DataSource dataSource() throws URISyntaxException {
        System.out.println("DEBUG#Criei o DataSource!");
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.postgresql.Driver");
        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;
    }

Com isso pude confirmar que os comandos gerados pelo hibernate não estão no padrão do Postgre, onde colunas identity são identificadas pelo tipo SERIAL e não por auto_increment como no MYSQL... com isso, a criação de tabelas está falhando e a execução da aplicação também. Abaixo segue as logs que mostram as DDLs executadas e os prints indicando a passagem nos métodos de configuração de produção no heroku.

2020-08-05T02:54:10.494931+00:00 app[web.1]: DEBUG#Criei o DataSource!
2020-08-05T02:54:10.521439+00:00 app[web.1]: DEBUG#PASSEI NO addProps
2020-08-05T02:54:12.307103+00:00 app[web.1]: Hibernate: alter table Produto_precos drop foreign key FK_hl4xdmygc7v2x607r4rbs6x3a
2020-08-05T02:54:12.311475+00:00 app[web.1]: Hibernate: alter table Usuario_Role drop foreign key FK_jnmoadyberbn5oyaybe8dxskj
2020-08-05T02:54:12.313351+00:00 app[web.1]: Hibernate: alter table Usuario_Role drop foreign key FK_fpipx83bjblmwmw25qotdyd3
2020-08-05T02:54:12.315228+00:00 app[web.1]: Hibernate: drop table if exists Produto
2020-08-05T02:54:12.317583+00:00 app[web.1]: Hibernate: drop table if exists Produto_precos
2020-08-05T02:54:12.321533+00:00 app[web.1]: Hibernate: drop table if exists Role
2020-08-05T02:54:12.323383+00:00 app[web.1]: Hibernate: drop table if exists Usuario
2020-08-05T02:54:12.325424+00:00 app[web.1]: Hibernate: drop table if exists Usuario_Role
2020-08-05T02:54:12.327903+00:00 app[web.1]: Hibernate: create table Produto (id integer not null auto_increment, dataLancamento datetime, descricao varchar(255), paginas integer not null, sumarioPath varchar(255), titulo varchar(255), primary key (id))
2020-08-05T02:54:12.338211+00:00 app[web.1]: Hibernate: create table Produto_precos (Produto_id integer not null, tipo integer, valor decimal(19,2))
2020-08-05T02:54:12.378474+00:00 app[web.1]: Hibernate: create table Role (nome varchar(255) not null, primary key (nome))
2020-08-05T02:54:12.405139+00:00 app[web.1]: Hibernate: create table Usuario (email varchar(255) not null, nome varchar(255), senha varchar(255), primary key (email))
2020-08-05T02:54:12.415982+00:00 app[web.1]: Hibernate: create table Usuario_Role (Usuario_email varchar(255) not null, roles_nome varchar(255) not null)

Achei curioso que a execução da criação da tabela Produto não apresenta nenhum erro na log, contudo este padrão de sintaxe não funcionou nem mesmo na linha de comando do postgre direto.

Com isso, na ausência da tabela produto a aplicação gera uma exception similar a de outra duvida anterior a minha:

2020-08-05T03:02:28.517830+00:00 app[web.1]: Caused by: org.postgresql.util.PSQLException: ERROR: relation "produto" does not exist

Já tentei trocar o dialeto na classe JPAProductionConfiguration mas aparentemente não fez nenhum efeito. As demais tabelas que não tem identity foram criadas normalmente pelo que consultei via linha de comando no console do postgre do heroku.

Poderiam me auxiliar a identificar porque estes comandos DDL estão sendo executados com erro de sintaxe por gentileza?

Obrigado!

1 resposta

Olá Bruno, tudo bem? Peço desculpas pela demora no retorno! Estranho isso, consegui criar as tabelas com sucesso no postgres sem precisar alterar os modelos, você pode dar uma olhada nas minhas classes de Produto, JPAConfiguration, JPAProductionConfiguration. E também seria melhor se você pudesse disponibilizar o projeto no GitHub pra gente verificar!

Fico aguardando retorno!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software