Compartir a través de


Uso de Spring Data JPA con Azure Database for PostgreSQL

En este tutorial se muestra cómo almacenar datos en Azure Database for PostgreSQL mediante Spring Data JPA.

Java Persistence API (JPA) es la API de Java estándar para la asignación relacional de objetos.

En este tutorial, incluimos dos métodos de autenticación: la autenticación de Microsoft Entra y la autenticación PostgreSQL. La pestaña Sin contraseña muestra la autenticación de Microsoft Entra y la pestaña Contraseña muestra la autenticación de PostgreSQL.

La autenticación de Microsoft Entra es un mecanismo de conexión a Azure Database for PostgreSQL mediante identidades definidas en Microsoft Entra ID. Con la autenticación de Microsoft Entra, puede administrar las identidades de los usuarios de la base de datos y otros servicios de Microsoft en una ubicación central, lo que simplifica la administración de permisos.

La autenticación de PostgreSQL usa cuentas almacenadas en PostgreSQL. Si decide usar contraseñas como credenciales para las cuentas, estas credenciales se almacenarán en la tabla user. Dado que estas contraseñas se almacenan en PostgreSQL, deberá administrar la rotación de las contraseñas por su cuenta.

Requisitos previos

  • Cliente de línea de comandos de PostgreSQL.

  • Si no tiene ninguna aplicación de Spring Boot, cree un proyecto de Maven con Spring Initializr. Asegúrese de seleccionar Proyecto de Maven y, en Dependencias, agregue las dependencias Web de Spring, Spring Data JDBC y Controlador PostgreSQL y, a continuación, seleccione Java versión 8 o posterior.

Importante

Para usar conexiones sin contraseña, configure el usuario administrador de Microsoft Entra para la instancia de servidor flexible de Azure Database for PostgreSQL. Consulte Administración de roles de Microsoft Entra en Azure Database for PostgreSQL - Servidor flexible para obtener más información.

Consulte la aplicación de ejemplo

En este tutorial, codificará una aplicación de ejemplo. Si desea ir más rápido, esta aplicación ya está codificada y disponible en https://github.com/Azure-Samples/quickstart-spring-data-jpa-postgresql.

Configuración de una regla de firewall para el servidor de PostgreSQL

De forma predeterminada, las instancias de Azure Database for PostgreSQL están protegidas. Tienen un firewall que no permite ninguna conexión entrante.

Para poder usar la base de datos, abra el firewall del servidor para permitir que la dirección IP local acceda al servidor de base de datos. Para obtener mas información, consulte Reglas de firewall en Azure Database for PostgreSQL - Servidor flexible.

Si se conecta al servidor de PostgreSQL desde el subsistema de Windows para Linux (WSL) en un equipo Windows, debe agregar el identificador de host de WSL al firewall.

Cree un usuario que no es administrador de PostgreSQL y conceda permisos

A continuación, cree un usuario que no sea administrador y concédale todos los permisos para la base de datos.

Puede usar el método siguiente para crear un usuario que no sea administrador que use una conexión sin contraseña.

  1. Use el siguiente comando para instalar la extensión sin contraseña de Service Connector para la CLI de Azure:

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. Use el siguiente comando para crear el usuario no administrador de 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
    

    Cuando finalice el comando, anote el nombre de usuario en la salida de la consola.

Almacenamiento de datos de Azure Database for PostgreSQL

Ahora que tiene una instancia de servidor flexible de Azure Database for PostgreSQL, puede almacenar datos mediante Spring Cloud Azure.

Para instalar el módulo Spring Cloud Azure Starter JDBC PostgreSQL, agregue las siguientes dependencias al archivo pom.xml :

  • La lista de materiales (BOM) de Azure de Spring Cloud:

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

    Nota:

    Si usa Spring Boot 2.x, asegúrese de establecer la versión de spring-cloud-azure-dependencies en 4.19.0. Esta lista de materiales (BOM) debe configurarse en la sección <dependencyManagement> del archivo pom.xml. Esto garantiza que todas las dependencias de Spring Cloud Azure usen la misma versión. Para obtener más información sobre la versión que se usa para esta lista de materiales, consulte Qué versión de Spring Cloud Azure debo usar.

  • El artefacto de Spring Cloud Azure Starter JDBC PostgreSQL:

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

Nota:

Se admiten conexiones sin contraseña desde la versión 4.5.0.

Configuración de Spring Boot para el uso de Azure Database for PostgreSQL

Para almacenar datos de Azure Database for PostgreSQL mediante Spring Data JPA, siga estos pasos para configurar la aplicación:

  1. Configure las credenciales de Azure Database for PostgreSQL agregando las siguientes propiedades al archivo de configuración 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 conexiones sin contraseña, configure el usuario administrador de Microsoft Entra para la instancia de servidor único de Azure Database for PostgreSQL. Para obtener más información, consulte Uso de Microsoft Entra ID para la autenticación con PostgreSQL.

Consulte la aplicación de ejemplo

En este artículo, se codificará una aplicación de ejemplo. Si desea ir más rápido, esta aplicación ya está codificada y disponible en https://github.com/Azure-Samples/quickstart-spring-data-jpa-postgresql.

Configuración de una regla de firewall para el servidor de PostgreSQL

De forma predeterminada, las instancias de Azure Database for PostgreSQL están protegidas. Tienen un firewall que no permite ninguna conexión entrante.

Para poder usar la base de datos, abra el firewall del servidor para permitir que la dirección IP local acceda al servidor de base de datos. Para obtener más información, consulte Creación y administración de reglas de firewall para Azure Database for PostgreSQL - Servidor único con Azure Portal.

Si se conecta al servidor de PostgreSQL desde el subsistema de Windows para Linux (WSL) en un equipo Windows, debe agregar el identificador de host de WSL al firewall.

Cree un usuario que no es administrador de PostgreSQL y conceda permisos

A continuación, cree un usuario que no sea administrador y concédale todos los permisos para la base de datos.

Puede usar el método siguiente para crear un usuario que no sea administrador que use una conexión sin contraseña.

  1. Use el siguiente comando para instalar la extensión sin contraseña de Service Connector para la CLI de Azure:

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. Use el siguiente comando para crear el usuario no administrador de 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
    

    Cuando finalice el comando, anote el nombre de usuario en la salida de la consola.

Almacenamiento de datos de Azure Database for PostgreSQL

Ahora que tiene una instancia de servidor único de Azure Database for PostgreSQL, puede almacenar datos mediante Spring Cloud Azure.

Para instalar el módulo Spring Cloud Azure Starter JDBC PostgreSQL, agregue las siguientes dependencias al archivo pom.xml :

  • La lista de materiales (BOM) de Azure de Spring Cloud:

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

    Nota:

    Si usa Spring Boot 2.x, asegúrese de establecer la versión de spring-cloud-azure-dependencies en 4.19.0. Esta lista de materiales (BOM) debe configurarse en la sección <dependencyManagement> del archivo pom.xml. Esto garantiza que todas las dependencias de Spring Cloud Azure usen la misma versión. Para obtener más información sobre la versión que se usa para esta lista de materiales, consulte Qué versión de Spring Cloud Azure debo usar.

  • El artefacto de Spring Cloud Azure Starter JDBC PostgreSQL:

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

Nota:

Se admiten conexiones sin contraseña desde la versión 4.5.0.

Configuración de Spring Boot para el uso de Azure Database for PostgreSQL

Para almacenar datos de Azure Database for PostgreSQL mediante Spring Data JPA, siga estos pasos para configurar la aplicación:

  1. Configure las credenciales de Azure Database for PostgreSQL agregando las siguientes propiedades al archivo de configuración 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. Cree una clase nueva de Java Todo. Esta clase es un modelo de dominio asignado en la tabla todo, que se creará automáticamente mediante JPA. El siguiente código ignora los métodos getters y 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 el archivo de clase de inicio para mostrar el siguiente contenido.

    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> {
    
    }
    

    Sugerencia

    En este tutorial, no hay ninguna operación de autenticación en las configuraciones ni en el código. Sin embargo, la conexión a los servicios de Azure requiere autenticación. Para completar la autenticación, debe usar Azure Identity. Spring Cloud Azure usa DefaultAzureCredential, que la biblioteca de Azure Identity proporciona para ayudarle a obtener credenciales sin cambios en el código.

    DefaultAzureCredential admite varios métodos de autenticación y determina qué método se usa en tiempo de ejecución. Este enfoque permite que la aplicación use diferentes métodos de autenticación en distintos entornos, como entornos locales o de producción, sin implementar código específico del entorno. Para obtener más información, vea DefaultAzureCredential.

    Para completar la autenticación en entornos de desarrollo local, puede usar la CLI de Azure, Visual Studio Code, PowerShell u otros métodos. Para obtener más información, consulte Autenticación de Azure en entornos de desarrollo de Java. Para completar la autenticación en entornos de hospedaje de Azure, se recomienda usar la identidad administrada asignada por el usuario. Para obtener más información, consulta ¿Qué son las identidades administradas para recursos de Azure?

  3. Inicie la aplicación. Verá registros similares a los del siguiente ejemplo:

    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
    

Implementación en Azure Spring Apps

Ahora que tiene la aplicación Spring Boot que se ejecuta localmente, es el momento de moverla a producción. Azure Spring Apps facilita la implementación de aplicaciones de Spring Boot en Azure sin necesidad de realizar cambios en el código. El servicio administra la infraestructura de las aplicaciones de Spring, con el fin de que los desarrolladores puedan centrarse en el código. Azure Spring Apps proporciona administración del ciclo de vida mediante el uso de una supervisión y un diagnóstico completos, administración de la configuración, detección de servicios, integración de CI/CD e implementaciones azul-verde, entre otros. Para implementar la aplicación en Azure Spring Apps, consulte Implementación de la primera aplicación en Azure Spring Apps.

Pasos siguientes