Cookie Consent by Free Privacy Policy Generator 📌 Flyway e Spring Boot em cenário de banco de dados não vazio.


✅ Flyway e Spring Boot em cenário de banco de dados não vazio.


💡 Newskategorie: Programmierung
🔗 Quelle: dev.to

Em um projeto de programação, em que estava construindo uma API com Spring Boot (Java), precisei adicionar alguns records numa tabela do meu banco de dados. Devido ao meu repertório e também buscando me desafiar, adicionei a dependência do Flyway para adicionar migrações ao meu banco de dados. Entretanto, ao adicionar o Flyway num projeto existente, ocorreram alguns comportamentos inesperados.

Mas, calma, tô voando.. O que é o Flyway?

Basicamente, o Flyway serve de versionamento de banco de dados. Suponha que existem 3 programadores rodando o mesmo projeto num ambiente de desenvolvimento. O ideal é que o banco de dados de todos (mesmo que em ambientes diferentes) possuam as mesmas tabelas.

Por meio de vários arquivos .sql, o Spring detecta a existência desses arquivos, roda o script SQL antes mesmo de criar as tabelas com o Hibernate. Assim, podemos criar arquivos .sql para criar as tabelas necessárias para o funcionamento correto da aplicação, garantindo que as tabelas possuem o mesmo formato para cada ambiente de desenvolvimento diferente. Uma forma de padronizar e manter o banco de dados atualizado para todos do time.

E Hibernate?

Hibernate é uma implementação da JPA (Java Persistence API), responsável pela ponte entre a sua aplicação e seu banco de dados. Todo método default do repository é implementado pelo Hibernate. O Hibernate também é o responsável por criar suas tabelas das entidades do seu projeto (classes anotadas com o @Entity).

O Hibernate já cria minhas tabelas, por qual razão eu preciso do Flyway?

Como já comentado acima, o Flyway é usado para padronizar as tabelas do seu projeto. Dessa forma, o Spring executa as migrações do Flyway antes mesmo de executar o Hibernate, logo, o ideal é que o time defina muito bem essas tabelas por meio de arquivos .sql no projeto.

A boa prática é criar as migrations antes mesmo de criar qualquer classe dentro do seu projeto.

Adicionando Flyway a um projeto existente

A motivação de escrever esse arquivo veio quando tentei adicionar o Flyway ao meu projeto que já possuía as tabelas mapeadas para cada entidade, criadas através do Hibernate.

Minha ideia era usar o Flyway apenas para inserir records numa tabela já existente, porém notei que as inserções não estavam acontecendo.

Dissecando o problema

Primeiro, fui atrás de criar novas migrations no projeto, para ter certeza de que o Flyway estava configurado corretamente e funcionando quando eu criava novas tabelas. E sim, ele funcionara corretamente quando foi criada uma tabela exemplo arbitrária.

Tendo em mente que o problema não estava na configuração da dependência externa, fui atrás de saber como funciona o relacionamento do Flyway com o Hibernate. O interessante (como já foi comentado nesse artigo) foi descobrir que o Flyway é executado antes do Hibernate. Dessa forma, era óbvio que minha lógica não funcionaria, afinal, como eu posso inserir records numa tabela que ainda não foi carregada pelo Hibernate?

O problema estava exatamente nessa ordem de execução das dependências.

Resolução

Bastou criar uma classe de configuração do Flyway para que fosse carregado o conteúdo do Hibernate antes do próprio Flyway. Para isso:

  1. Defini a propriedade spring.flyway.enabled=false no application.properties
  2. Criei uma classe de configuração Flyway FlywayConfig.java
@Configuration
public class FlywayConfig {

    @Autowired
    public FlywayConfig(DataSource dataSource) {
        Flyway.configure()
                .baselineVersion("0.0")
                .baselineOnMigrate(true)
                .dataSource(dataSource)
                .load().migrate();
    }
}

O próprio Spring injeta o dataSource nesse construtor do Flyway, indicando que ele deve carregar primeiro o banco de dados .dataSource(dataSource).load() e apenas depois executar a migração, por meio do método migrate().

Feito isso, criei uma nova migration com inserção de records V4__insert_user.sql

insert into tb_user(id, email, name, password, username) values
(7, '[email protected]', 'zeldris', 'zeldris', 'zeldris');

E voilà, a record está inserida na minha tabela:
tela mostrando a inserção

Conclusão

O intuito desse artigo é compartilhar essa noção de funcionamento das duas dependências que lidam com banco de dados: Hibernate e Flyway, além de ajudar aqueles que estão com o projeto existente e passam pela mesma situação de mal funcionamento das migrations da ferramenta.

...

✅ Flyway e Spring Boot em cenário de banco de dados não vazio.


📈 181.1 Punkte

✅ Database Migrations : Flyway for Spring Boot projects


📈 45.6 Punkte

✅ Não vendemos seus dados | Travis Witteveen, CEO da Avira


📈 41.81 Punkte

✅ Como adicionar banco de dados em uma aplicação .NET 7 [PT-BR]


📈 40.81 Punkte

✅ Dockerizando uma API Express.js com Banco de Dados PostgreSQL para Testes e Produção


📈 40.81 Punkte

✅ Entenda a diferença entre modelo conceitual e modelo lógico em Banco de Dados


📈 40.81 Punkte

✅ Banco de dados: Modelo conceitual


📈 40.81 Punkte

✅ Aprenda de uma vez o que é Banco de Dados e SGBD


📈 40.81 Punkte

✅ Redis: Um Guia Completo sobre o Banco de Dados em Memória - Curso em vídeo


📈 40.81 Punkte

✅ Eventual consistência em sistemas de banco de dados distribuídos


📈 40.81 Punkte

✅ Como normalizar banco de dados?


📈 40.81 Punkte

✅ Destrancando o Docker: Garantindo que seu aplicativo espere pelo banco de dados com Dockerize


📈 40.81 Punkte

✅ [Desafio] - 10 Desafios Simples de System Design: Resolução 0/9 (Separar um Banco de Dados em Dois)


📈 40.81 Punkte

✅ 3 motivos do porquê testes unitários não são suficientes para Microservices com Spring Boot


📈 39.23 Punkte

✅ Spring vs Spring MVC vs Spring Boot: A Detailed Comparison for Java Developers


📈 36.92 Punkte

✅ software-architektur.tv: GraalVM mit Spring Native, Spring Boot und Spring Cloud


📈 36.92 Punkte

✅ How to Use Spring Boot Eureka Server in Spring Boot 3.3.0+


📈 35.23 Punkte

✅ Usando a IA do Google SafeSearch em um cenário real


📈 34.72 Punkte

✅ Run Flyway DB migrations with AWS Lambda and RDS - Part 1


📈 27.99 Punkte

✅ Github Actions: how to deploy application to AWS ECS and migrate database with Flyway


📈 27.99 Punkte

✅ How to enable DEBUG logs in Flyway?


📈 27.99 Punkte

✅ Secure Schema Migrations With Flyway and CockroachDB Dedicated


📈 27.99 Punkte

✅ SQL Server and Flyway: a Docker approach


📈 27.99 Punkte

✅ Flyway Migrations Naming Strategy in a Big Project


📈 27.99 Punkte

✅ Spring Boot 2.0 mit Support für Spring Framework 5.0 veröffentlicht


📈 27.27 Punkte

✅ Learn Spring Boot and Spring Data JPA


📈 27.27 Punkte

✅ Spring Boot & Spring Data JPA – Complete Course


📈 27.27 Punkte

✅ Upgrade Guide To Spring Boot 3.0 for Spring Data JPA and Querydsl


📈 27.27 Punkte

✅ Spring & Spring Boot Interview Guide


📈 27.27 Punkte

✅ Build CRUD RESTful API Using Spring Boot 3, Spring Data JPA, Hibernate, and MySQL Database


📈 27.27 Punkte

✅ Spring Boot 3 application on AWS Lambda - Part 9 Develop application with Spring Cloud Function AWS


📈 27.27 Punkte

✅ Spring Boot 3.0 setzt auf Spring Framework 6.0 und Java 17


📈 27.27 Punkte

✅ Locking Down Your Spring Boot Apps: A Deep Dive into Spring Security


📈 27.27 Punkte











matomo

Datei nicht gefunden!