Usar o Spring Data JPA com o Banco de Dados do Azure para PostgreSQL

Este tutorial demonstra como armazenar dados no Banco de Dados do Azure para PostgreSQL usando o Spring Data JPA.

A JPA (API de Persistência Java) é a API Java padrão para o mapeamento relacional de objeto.

Neste tutorial, incluímos dois métodos de autenticação: autenticação Microsoft Entra e autenticação PostgreSQL. A guia Sem senha mostra a autenticação do Microsoft Entra e a guia Senha mostra a autenticação do PostgreSQL.

A autenticação do Microsoft Entra é um mecanismo de conexão do Banco de Dados do Azure para PostgreSQL que usa as identidades definidas no Microsoft Entra ID. Com a autenticação do Microsoft Entra, você pode gerenciar as identidades de usuários do banco de dados e outros serviços da Microsoft em uma só localização central, o que simplifica o gerenciamento de permissões.

A autenticação PostgreSQL usa contas armazenadas no PostgreSQL. Se você optar por usar senhas como credenciais para as contas, essas credenciais serão armazenadas na tabela user. Como essas senhas são armazenadas no PostgreSQL, você mesmo precisa gerenciar a rotação das senhas.

Pré-requisitos

  • Cliente de linha de comando PostgreSQL.

  • Se você não tiver um aplicativo Spring Boot, crie um projeto Maven com o Spring Initializr. Certifique-se de selecionar Projeto Maven e, em Dependências, adicione as dependências Spring Web, Spring Data JDBC e PostgreSQL Driver e, em seguida, selecione Java versão 8 ou superior.

Importante

Para usar conexões sem senha, configure o usuário administrador do Microsoft Entra para sua instância do Banco de Dados do Azure para PostgreSQL Flexible Server. Para obter mais informações, consulte Gerenciar funções do Microsoft Entra no Banco de Dados do Azure para PostgreSQL - Servidor flexível.

Veja o aplicativo de exemplo

Neste tutorial, você codificará um aplicativo de exemplo. Caso você queira adiantar o processo, esse aplicativo já está codificado e disponível em https://github.com/Azure-Samples/quickstart-spring-data-jpa-postgresql.

Configurar uma regra de firewall para o servidor PostgreSQL

As instâncias do Banco de Dados do Azure para PostgreSQL são protegidas por padrão. Elas têm um firewall que não permite nenhuma conexão de entrada.

Para poder usar seu banco de dados, abra o firewall do servidor para permitir que o endereço IP local acesse o servidor de banco de dados. Para obter mais informações, consulte Regras de firewall no Banco de Dados do Azure para PostgreSQL - Servidor flexível.

Se você estiver se conectando ao servidor PostgreSQL a partir do Windows Subsystem for Linux (WSL) em um computador Windows, será necessário adicionar o ID do host WSL ao firewall.

Criar um usuário não administrador do PostgreSQL e conceder permissão

Em seguida, crie um usuário não administrador e conceda a ele todas as permissões para o banco de dados.

Você pode usar o método a seguir para criar um usuário não administrador que usa uma conexão sem senha.

  1. Use o seguinte comando para instalar a extensão sem senha do Service Connector para a CLI do Azure:

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. Use o seguinte comando para criar o usuário não administrador do Microsoft Entra:

      az connection create postgres-flexible \
           --resource-group <your_resource_group_name> \
           --connection postgres_conn \
           --target-resource-group <your_resource_group_name> \
           --server postgresqlflexibletest \
           --database demo \
           --user-account \
           --query authInfo.userName \
           --output tsv
    

    Quando o comando for concluído, anote o nome de usuário na saída do console.

Armazenar dados do Banco de Dados do Azure para PostgreSQL

Agora que você tem uma instância do Banco de Dados do Azure para PostgreSQL Flexible Server, pode armazenar dados usando o Spring Cloud Azure.

Para instalar o módulo JDBC PostgreSQL do Spring Cloud Azure Starter, adicione as seguintes dependências ao arquivo pom.xml :

  • A lista de materiais do Spring Cloud Azure (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.11.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Observação

    Se você estiver usando o Spring Boot 2.x, certifique-se de definir a spring-cloud-azure-dependencies versão como 4.17.0. Esta lista de materiais (BOM) deve ser configurada <dependencyManagement> na seção do arquivo pom.xml . Isso garante que todas as dependências do Spring Cloud Azure estejam usando a mesma versão. Para obter mais informações sobre a versão usada para esta BOM, consulte Qual versão do Spring Cloud Azure devo usar.

  • O artefato JDBC PostgreSQL do Spring Cloud Azure Starter:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-jdbc-postgresql</artifactId>
    </dependency>
    

Observação

Conexões sem senha são suportadas desde a versão 4.5.0.

Configurar o Spring Boot para usar o Banco de Dados do Azure para PostgreSQL

Para armazenar dados do Banco de Dados do Azure para PostgreSQL usando o Spring Data JPA, siga estas etapas para configurar o aplicativo:

  1. Configure o Banco de Dados do Azure para credenciais PostgreSQL adicionando as seguintes propriedades ao arquivo de configuração application.properties .

    logging.level.org.hibernate.SQL=DEBUG
    
    spring.datasource.url=jdbc:postgresql://postgresqlflexibletest.postgres.database.azure.com:5432/demo?sslmode=require
    spring.datasource.username=<your_postgresql_ad_non_admin_username>
    spring.datasource.azure.passwordless-enabled=true
    
    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
    

Importante

Para usar conexões sem senha, configure o usuário administrador do Microsoft Entra para sua instância do Banco de Dados do Azure para PostgreSQL Single Server. Para obter mais informações, consulte Usar o Microsoft Entra ID para autenticação com PostgreSQL.

Veja o aplicativo de exemplo

Neste artigo, você codificará um aplicativo de exemplo. Caso você queira adiantar o processo, esse aplicativo já está codificado e disponível em https://github.com/Azure-Samples/quickstart-spring-data-jpa-postgresql.

Configurar uma regra de firewall para o servidor PostgreSQL

As instâncias do Banco de Dados do Azure para PostgreSQL são protegidas por padrão. Elas têm um firewall que não permite nenhuma conexão de entrada.

Para poder usar seu banco de dados, abra o firewall do servidor para permitir que o endereço IP local acesse o servidor de banco de dados. Para obter mais informações, consulte Criar e gerenciar regras de firewall para o Banco de Dados do Azure para PostgreSQL - Servidor Único usando o portal do Azure.

Se você estiver se conectando ao servidor PostgreSQL a partir do Windows Subsystem for Linux (WSL) em um computador Windows, será necessário adicionar o ID do host WSL ao firewall.

Criar um usuário não administrador do PostgreSQL e conceder permissão

Em seguida, crie um usuário não administrador e conceda a ele todas as permissões para o banco de dados.

Você pode usar o método a seguir para criar um usuário não administrador que usa uma conexão sem senha.

  1. Use o seguinte comando para instalar a extensão sem senha do Service Connector para a CLI do Azure:

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. Use o seguinte comando para criar o usuário não administrador do Microsoft Entra:

      az connection create postgres \
           --resource-group <your_resource_group_name> \
           --connection postgres_conn \
           --target-resource-group <your_resource_group_name> \
           --server postgresqlsingletest \
           --database demo \
           --user-account \
           --query authInfo.userName \
           --output tsv
    

    Quando o comando for concluído, anote o nome de usuário na saída do console.

Armazenar dados do Banco de Dados do Azure para PostgreSQL

Agora que você tem um Banco de Dados do Azure para instância de servidor único PostgreSQL, você pode armazenar dados usando o Spring Cloud Azure.

Para instalar o módulo JDBC PostgreSQL do Spring Cloud Azure Starter, adicione as seguintes dependências ao arquivo pom.xml :

  • A lista de materiais do Spring Cloud Azure (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.11.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Observação

    Se você estiver usando o Spring Boot 2.x, certifique-se de definir a spring-cloud-azure-dependencies versão como 4.17.0. Esta lista de materiais (BOM) deve ser configurada <dependencyManagement> na seção do arquivo pom.xml . Isso garante que todas as dependências do Spring Cloud Azure estejam usando a mesma versão. Para obter mais informações sobre a versão usada para esta BOM, consulte Qual versão do Spring Cloud Azure devo usar.

  • O artefato JDBC PostgreSQL do Spring Cloud Azure Starter:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-jdbc-postgresql</artifactId>
    </dependency>
    

Observação

Conexões sem senha são suportadas desde a versão 4.5.0.

Configurar o Spring Boot para usar o Banco de Dados do Azure para PostgreSQL

Para armazenar dados do Banco de Dados do Azure para PostgreSQL usando o Spring Data JPA, siga estas etapas para configurar o aplicativo:

  1. Configure o Banco de Dados do Azure para credenciais PostgreSQL adicionando as seguintes propriedades ao arquivo de configuração application.properties .

    logging.level.org.hibernate.SQL=DEBUG
    
    spring.datasource.url=jdbc:postgresql://postgresqlsingletest.postgres.database.azure.com:5432/demo?sslmode=require
    spring.datasource.username=<your_postgresql_ad_non_admin_username>@postgresqlsingletest
    spring.datasource.azure.passwordless-enabled=true
    
    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
    
  1. Crie uma nova Todo classe Java. Essa classe é um modelo de domínio mapeado todo na tabela que será criado automaticamente pelo JPA. O código a seguir ignora os getters métodos e setters .

    package com.example.demo;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    @Entity
    public class Todo {
    
        public Todo() {
        }
    
        public Todo(String description, String details, boolean done) {
            this.description = description;
            this.details = details;
            this.done = done;
        }
    
        @Id
        @GeneratedValue
        private Long id;
    
        private String description;
    
        private String details;
    
        private boolean done;
    
    }
    
  2. Edite o arquivo de classe de inicialização para mostrar o conteúdo a seguir.

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.context.event.ApplicationReadyEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.annotation.Bean;
    import org.springframework.data.jpa.repository.JpaRepository;
    
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    @SpringBootApplication
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @Bean
        ApplicationListener<ApplicationReadyEvent> basicsApplicationListener(TodoRepository repository) {
            return event->repository
                .saveAll(Stream.of("A", "B", "C").map(name->new Todo("configuration", "congratulations, you have set up correctly!", true)).collect(Collectors.toList()))
                .forEach(System.out::println);
        }
    
    }
    
    interface TodoRepository extends JpaRepository<Todo, Long> {
    
    }
    

    Dica

    Neste tutorial, não há operações de autenticação nas configurações ou no código. No entanto, a conexão com os serviços do Azure requer autenticação. Para concluir a autenticação, você precisa usar a Identidade do Azure. O Spring Cloud Azure usa DefaultAzureCredentialo , que a biblioteca de Identidade do Azure fornece para ajudá-lo a obter credenciais sem alterações de código.

    DefaultAzureCredential dá suporte a vários métodos de autenticação e determina qual método usar no runtime. Essa abordagem permite que seu aplicativo use métodos de autenticação diferentes em ambientes diferentes (como ambientes locais e de produção) sem implementar código específico do ambiente. Para obter mais informações, consulte DefaultAzureCredential.

    Para concluir a autenticação em ambientes de desenvolvimento local, você pode usar a CLI do Azure, o Visual Studio Code, o PowerShell ou outros métodos. Para obter mais informações, consulte Autenticação do Azure em ambientes de desenvolvimento Java. Para concluir a autenticação em ambientes de hospedagem do Azure, recomendamos usar a identidade gerenciada atribuída pelo usuário. Para obter mais informações, confira O que são as identidades gerenciadas para recursos do Azure?

  3. Inicie o aplicativo. Você verá logs semelhantes ao exemplo a seguir:

    2023-02-01 10:29:19.763 DEBUG 4392 --- [main] org.hibernate.SQL : insert into todo (description, details, done, id) values (?, ?, ?, ?)
    com.example.demo.Todo@1f
    

Implantar no Azure Spring Apps

Agora que você tem o aplicativo Spring Boot em execução localmente, é hora de movê-lo para a produção. Os Aplicativos Spring do Azure facilitam a implantação de aplicativos Spring Boot no Azure sem alterações de código. O serviço gerencia a infraestrutura dos aplicativos do Spring para que os desenvolvedores possam se concentrar no código. O Azure Spring Apps fornece gerenciamento de ciclo de vida usando monitoramento e diagnóstico abrangentes, gerenciamento de configuração, descoberta de serviços, integração de CI/CD, implantações em “blue-green” e muito mais. Para implantar seu aplicativo nos Aplicativos Spring do Azure, consulte Implantar seu primeiro aplicativo nos Aplicativos Spring do Azure.

Próximas etapas