通过


将 Spring Data JPA 与 Azure Database for PostgreSQL 配合使用

本教程演示如何使用 Spring Data JPAAzure Database for PostgreSQL> 中。

Java持久性 API(JPA)是对象关系映射的标准Java API。

在本教程中,我们包括两种身份验证方法:Microsoft Entra身份验证和 PostgreSQL 身份验证。 Passwordless 选项卡显示Microsoft Entra身份验证,Password选项卡显示 PostgreSQL 身份验证。

Microsoft Entra身份验证是一种使用Microsoft Entra ID中定义的标识连接到Azure Database for PostgreSQL的机制。 使用Microsoft Entra身份验证,可以在中心位置管理数据库用户标识和其他Microsoft 服务,从而简化权限管理。

PostgreSQL 身份验证使用存储在 PostgreSQL 中的帐户。 如果你选择使用密码作为帐户的凭据,这些凭据将存储在 user 表中。 由于这些密码存储在 PostgreSQL 中,因此你需要自行管理密码的轮换。

先决条件

  • PostgreSQL 命令行客户端

  • 如果你没有 Spring Boot 应用程序,请使用 Spring Initializr 创建一个 Maven 项目。 请务必选择 Maven Project,然后在 Dependencies 添加 Spring WebSpring Data JDBCPostgreSQL Driver 依赖项,然后选择Java版本 8 或更高版本。

重要

若要使用无密码连接,请为 Azure Database for PostgreSQL 灵活服务器实例配置Microsoft Entra管理员用户。 有关详细信息,请参阅 管理 Microsoft Entra 角色在 Azure Database for PostgreSQL——灵活服务器中的使用

请参阅示例应用程序

在本教程中,你将编写一个示例应用程序。 若要更快地运行,此应用程序已编码并可在 https://github.com/Azure-Samples/quickstart-spring-data-jpa-postgresql 中使用。

为 PostgreSQL 服务器配置防火墙规则

默认情况下,Azure Database for PostgreSQL实例受到保护。 它们有不允许任何传入连接的防火墙。

为了能够使用你的数据库,请打开服务器的防火墙,以允许本地 IP 地址访问数据库服务器。 有关详细信息,请参阅 Azure Database for PostgreSQL - 灵活服务器中的 Firewall 规则

如果要从 Windows 计算机上的 适用于 Linux 的 Windows 子系统 (WSL) 连接到 PostgreSQL 服务器,则需要将 WSL 主机 ID 添加到防火墙。

创建 PostgreSQL 非管理员用户并授予权限

接下来创建一个非管理员用户,并为其授予对数据库的所有权限。

可以使用以下方法创建使用无密码连接的非管理员用户。

  1. 使用以下命令安装 Service Connector Azure CLI 的无密码扩展:

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. 使用以下命令创建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
    

    命令完成后,记下控制台输出中的用户名。

存储来自Azure Database for PostgreSQL的数据

有了Azure Database for PostgreSQL灵活服务器实例后,可以使用 Spring Cloud Azure来存储数据。

若要安装 Spring Cloud Azure Starter JDBC PostgreSQL 模块,请将以下依赖项添加到 pom.xml 文件中:

  • Spring Cloud Azure 材料清单(BOM):

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

    注意

    如果使用 Spring Boot 4.0.x,请确保将 spring-cloud-azure-dependencies 版本设置为 7.2.0

    如果使用 Spring Boot 3.5.x,请确保将 spring-cloud-azure-dependencies 版本设置为 6.2.0

    如果使用 Spring Boot 3.1.x-3.5.x,请确保将 spring-cloud-azure-dependencies 版本设置为 5.25.0

    如果使用 Spring Boot 2.x,请确保将 spring-cloud-azure-dependencies 版本设置为 4.20.0

    应在 <dependencyManagement> 文件的 部分中配置此材料清单(BOM)。 这可确保所有 Spring Cloud Azure依赖项都使用相同的版本。

    有关用于此 BOM 的版本的详细信息,请参阅 我应该使用哪个 Spring Cloud Azure 版本

  • Spring Cloud Azure Starter JDBC PostgreSQL 工件:

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

注意

自版本 4.5.0 以来,支持无密码连接。

将 Spring Boot 配置为使用 Azure Database for PostgreSQL

若要使用 Spring Data JPA 存储来自Azure Database for PostgreSQL的数据,请执行以下步骤来配置应用程序:

  1. 通过将以下属性添加到 application.properties 配置文件来配置Azure Database for PostgreSQL凭据。

    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
    

重要

若要使用无密码连接,请为 Azure Database for PostgreSQL 单服务器实例配置Microsoft Entra管理员用户。 有关详细信息,请参阅 使用 Microsoft Entra ID 通过 PostgreSQL 进行身份验证

请参阅示例应用程序

在本文中,你将编写一个示例应用程序。 若要更快地运行,此应用程序已编码并可在 https://github.com/Azure-Samples/quickstart-spring-data-jpa-postgresql 中使用。

为 PostgreSQL 服务器配置防火墙规则

默认情况下,Azure Database for PostgreSQL实例受到保护。 它们有不允许任何传入连接的防火墙。

为了能够使用你的数据库,请打开服务器的防火墙,以允许本地 IP 地址访问数据库服务器。 有关详细信息,请参阅 使用 Azure 门户创建和管理Azure Database for PostgreSQL单一服务器的防火墙规则

如果要从 Windows 计算机上的 适用于 Linux 的 Windows 子系统 (WSL) 连接到 PostgreSQL 服务器,则需要将 WSL 主机 ID 添加到防火墙。

创建 PostgreSQL 非管理员用户并授予权限

接下来创建一个非管理员用户,并为其授予对数据库的所有权限。

可以使用以下方法创建使用无密码连接的非管理员用户。

  1. 使用以下命令安装 Service Connector Azure CLI 的无密码扩展:

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. 使用以下命令创建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
    

    命令完成后,记下控制台输出中的用户名。

存储来自Azure Database for PostgreSQL的数据

有了Azure Database for PostgreSQL单一服务器实例后,即可使用 Spring Cloud Azure存储数据。

若要安装 Spring Cloud Azure Starter JDBC PostgreSQL 模块,请将以下依赖项添加到 pom.xml 文件中:

  • Spring Cloud Azure 材料清单(BOM):

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

    注意

    如果使用 Spring Boot 4.0.x,请确保将 spring-cloud-azure-dependencies 版本设置为 7.2.0

    如果使用 Spring Boot 3.5.x,请确保将 spring-cloud-azure-dependencies 版本设置为 6.2.0

    如果使用 Spring Boot 3.1.x-3.5.x,请确保将 spring-cloud-azure-dependencies 版本设置为 5.25.0

    如果使用 Spring Boot 2.x,请确保将 spring-cloud-azure-dependencies 版本设置为 4.20.0

    应在 <dependencyManagement> 文件的 部分中配置此材料清单(BOM)。 这可确保所有 Spring Cloud Azure依赖项都使用相同的版本。

    有关用于此 BOM 的版本的详细信息,请参阅 我应该使用哪个 Spring Cloud Azure 版本

  • Spring Cloud Azure Starter JDBC PostgreSQL 项目:

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

注意

自版本 4.5.0 以来,支持无密码连接。

将 Spring Boot 配置为使用 Azure Database for PostgreSQL

若要使用 Spring Data JPA 存储来自Azure Database for PostgreSQL的数据,请执行以下步骤来配置应用程序:

  1. 通过将以下属性添加到 application.properties 配置文件来配置Azure Database for PostgreSQL凭据。

    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. 创建新的 Todo Java 类。 此类是映射到 todo 表的域模型,将由 JPA 自动创建。 下面的代码忽略 getterssetters 方法。

    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. 编辑启动类文件以显示以下内容。

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

    提示

    在本教程中,配置或代码中没有身份验证操作。 但是,连接到Azure服务需要身份验证。 若要完成身份验证,需要使用Azure标识。 Spring Cloud Azure使用Azure标识库提供的DefaultAzureCredential,帮助你获取凭据,无须进行任何代码更改。

    DefaultAzureCredential 支持多种身份验证方法,并确定应在运行时使用哪种方法。 通过这种方法,你的应用可在不同环境(例如本地与生产环境)中使用不同的身份验证方法,而无需实现特定于环境的代码。 有关详细信息,请参阅 DefaultAzureCredential

    若要在本地开发环境中完成身份验证,可以使用 Azure CLI、Visual Studio Code、PowerShell 或其他方法。 有关详细信息,请参阅Java开发环境中Azure身份验证。 若要在Azure托管环境中完成身份验证,建议使用用户分配的托管标识。 有关详细信息,请参阅 Azure 资源的托管标识是什么?

  3. 启动应用程序。 将会看到类似于以下示例的日志:

    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
    

部署到Azure Spring Apps

现在,你已在本地运行 Spring Boot 应用程序,是时候将其转移到生产环境了。 Azure Spring Apps可以轻松地将 Spring Boot 应用程序部署到Azure,而无需更改任何代码。 该服务管理 Spring 应用程序的基础结构,让开发人员可以专注于代码。 Azure Spring Apps使用全面的监视和诊断、配置管理、服务发现、CI/CD 集成、蓝绿部署等提供生命周期管理。 若要将应用程序部署到 Azure Spring Apps,请参阅 将第一个应用程序部署到 Azure Spring Apps

后续步骤

适用于 Spring 开发人员的 AzureSpring Cloud Azure PostgreSQL 示例