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!

2
respostas

Tabelas batch não estão sendo criadas no postgresql

Olá pessoal!

Seguindo o curso de Spring Batch ao executar o job notei que as tabelas que devem ser criadas pelo Spring batch automaticamente não foram criadas no meu banco, porém a conexão com o banco está correta uma vez que ao rodar o programa ele executa sem erros, a tabela importacao foi criada tendo salvo as informações contida no arquivo dados.csv na tabela . Não estou conseguindo identificar o quê esta faltando para que o Spring Batch possa criar as tabelas e gerenciar os logs no postgres já que por default ele vem configurado para fazer esse gerenciamento em bancos em mémorias como o H2 por exemplo.

Como meu projeto foi criado, note que estou utilizando a versão 4.1.1 ou invés da 3.2.2 sugerida no curso já que ela esta defasada:
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Meu application.yaml, ele esta com algumas configurações a mais devido as tentativas de solucionar o problema:

spring:
    application:
        name: codetickets

    datasource:
        url: jdbc:postgresql://localhost:5432/codetickets
        jdbc-url: jdbc:postgresql://localhost:5432/codetickets
        username: "${POSTGRES_USERNAME}"
        password: "${POSTGRES_PASSWORD}"
        driver-class-name: org.postgresql.Driver

    batch:
        jdbc:
            initialize-schema: always

    jpa:
        hibernate:
            ddl-auto: update

logging:
    level:
        org.springframework.batch: DEBUG
        org.springframework.jdbc.core: DEBUG

Meu ImportacaoJobConfiguration:

@Configuration
public class ImportacaoJobConfiguration {

    private final PlatformTransactionManager transactionManager;

    public ImportacaoJobConfiguration(PlatformTransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }

    @Bean
    public Job job(Step passoInicial, JobRepository jobRepository) {
        return new JobBuilder("geracaoTickets", jobRepository)
                .start(passoInicial)
                .incrementer(new RunIdIncrementer())
                .build();
    }

    @Bean
    public Step passoInicial(ItemReader<Importacao> reader, ItemWriter<Importacao> writer,
            JobRepository jobRepository) {
        return new StepBuilder("passoInicial", jobRepository)
                .<Importacao, Importacao>chunk(200)
                .transactionManager(transactionManager)
                .reader(reader)
                .writer(writer)
                .build();
    }

    @Bean
    public ItemReader<Importacao> reader() {
        return new FlatFileItemReaderBuilder<Importacao>()
                .name("leituraCsv")
                .resource(new FileSystemResource("files/dados.csv"))
                .comments("--")
                .delimited()
                .delimiter(";")
                .names(
                        "cpf",
                        "cliente",
                        "nascimento",
                        "evento",
                        "data",
                        "tipoIngresso",
                        "valor")
                .fieldSetMapper(new ImportacaoMapper())
                .build();
    }

    @Bean
    public ItemWriter<Importacao> writer(DataSource dataSource) {
        return new JdbcBatchItemWriterBuilder<Importacao>()
                .dataSource(dataSource)
                .sql("""
                        INSERT INTO importacao (
                            cpf, cliente, nascimento, evento, data, tipo_ingresso, valor, hora_importacao)
                        VALUES (
                            :cpf, :cliente, :nascimento, :evento, :data, :tipoIngresso, :valor, LOCALTIMESTAMP(0))
                        """)
                .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
                .build();
    }
}

Como alternativa até criei as tabelas manualmente usando o script, mas ao executar a aplicação nenhum registro foi salvo nelas.

2 respostas

Olá, Jards! Tudo bem?

Parece que você está enfrentando um problema comum quando se utiliza o Spring Batch com bancos de dados diferentes do H2. Vamos tentar resolver isso juntos.

  1. Verifique a configuração do initialize-schema: Você já configurou spring.batch.jdbc.initialize-schema: always, o que está correto para garantir que as tabelas sejam criadas automaticamente. No entanto, certifique-se de que essa configuração está sendo aplicada corretamente. Às vezes, problemas de cache ou de contexto podem impedir que as configurações sejam lidas corretamente.

  2. Dependências do Maven: Certifique-se de que as dependências do Spring Batch e do driver do PostgreSQL estão corretamente configuradas no seu pom.xml. Algo como:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>
    
  3. Verifique os logs: Como você já configurou o nível de log para DEBUG, verifique se há mensagens nos logs que possam indicar o porquê das tabelas não estarem sendo criadas. Isso pode dar uma pista se há algum erro ou configuração faltando.

  4. Versão do Spring Boot: Você mencionou que está usando a versão 4.1.1. Certifique-se de que todas as suas dependências são compatíveis com essa versão. Às vezes, incompatibilidades de versão podem causar comportamentos inesperados.

  5. Permissões no Banco de Dados: Verifique se o usuário do banco de dados tem as permissões necessárias para criar tabelas. Isso pode ser verificado executando um simples comando de criação de tabela manualmente no banco.

  6. Scripts SQL: Como alternativa, você pode verificar se os scripts SQL de criação de tabela do Spring Batch estão sendo carregados. Eles geralmente estão localizados em org/springframework/batch/core/schema-postgresql.sql dentro do jar do Spring Batch. Você pode executá-los manualmente para garantir que as tabelas estejam no lugar.

Espero ter ajudado e fico à disposição se precisar.

Abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado

Opa Daniel!

Desde já agradeço a ajuda, vamos lá. Respondendo os tópocos que você citou;

1 - Verifique a configuração do initialize-schema: Com relação a ser problema de cache, já garanti que não é.
2 - Dependências do Maven: Todas as dependências estão compativeis com a versão, o pom não apresenta nenhuma critica e as dependências mencionadas constam no arquivo.

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

3 - Verifique os logs: Segue o log ao executar a aplicação.

3.1 - Logo Conexão com o banco de dados PostgreSQL

2026-09-09T08:48:08.183-03:00  INFO 20605 --- [codetickets] [           main] org.hibernate.orm.connections.pooling    : HHH10001005: Database info:
        Database JDBC URL [jdbc:postgresql://localhost:5432/codetickets]
        Database driver: PostgreSQL JDBC Driver

3.2 - Inicialização de Scripts/Tabelas

DataSourceInitializationAutoConfiguration matched:
      - @ConditionalOnClass found required class 'org.springframework.jdbc.datasource.init.DatabasePopulator' (OnClassCondition)
      - SQL InitializationDatabase Initialization default value is EMBEDDED (OnSqlInitializationCondition)
      - @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource'; @ConditionalOnMissingBean (types: org.springframework.boot.sql.autoconfigure.init.ApplicationScriptDatabaseInitializer; SearchStrategy: all) did not find any beans (OnBeanCondition)

3.3 - Execução do Job (Insere no banco de dados, mas não executa SQL nas tabelas BATCH_*)

2026-09-09T08:48:09.378-03:00  INFO 20605 --- [codetickets] [           main] o.s.b.c.l.s.TaskExecutorJobLauncher      : Job: [SimpleJob: [name=geracaoTickets]] launched with the following parameters: [{JobParameter{name='run.id', value=1, type=class java.lang.Long, identifying=true}}]
2026-09-09T08:48:09.446-03:00 DEBUG 20605 --- [codetickets] [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL batch update [INSERT INTO importacao (
    cpf, cliente, nascimento, evento, data, tipo_ingresso, valor, hora_importacao)
VALUES (
    ?, ?, ?, ?, ?, ?, ?, LOCALTIMESTAMP(0))
]
2026-09-09T08:48:09.487-03:00  INFO 20605 --- [codetickets] [           main] o.s.b.c.l.s.TaskExecutorJobLauncher      : Job: [SimpleJob: [name=geracaoTickets]] completed with the following parameters: [{JobParameter{name='run.id', value=1, type=class java.lang.Long, identifying=true}}] and the following status: [COMPLETED] in 104ms

4 - Versão do Spring Boot: Não há incompatibilidades de versão
5 - Permissões no Banco de Dados: Usuário possue permissão, tanto que a tabela importacao esta sendo criada e populada com os dados do arquivo dados.csv
6 - Scripts SQL: Após executar mvn clean install -U e tentar acessar dentro os scripts SQL de criação de tabela do Spring Batch.jar verifiquei que o caminho org/springframework/batch/core/schema-postgresql.sql não esta sendo criado.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade
Insira aqui a descrição dessa imagem para ajudar na acessibilidade