Usare Spring Data JPA con Database SQL di Azure

Questa esercitazione illustra come archiviare i dati in database SQL di Azure usando Spring Data JPA.

JPA (Java Persistence API) è l'API Java standard per il mapping relazionale a oggetti.

In questa esercitazione sono inclusi due metodi di autenticazione: autenticazione di Microsoft Entra e autenticazione database SQL. La scheda Senza password mostra l'autenticazione di Microsoft Entra e la scheda Password mostra l'autenticazione database SQL.

L'autenticazione di Microsoft Entra è un meccanismo per la connessione a Database di Azure per database SQL usando le identità definite in Microsoft Entra ID. Con l'autenticazione di Microsoft Entra, è possibile gestire le identità utente del database e altre servizi Microsoft in una posizione centrale, semplificando la gestione delle autorizzazioni.

database SQL'autenticazione usa gli account archiviati in database SQL. Se si sceglie di usare le password come credenziali per gli account, queste credenziali verranno archiviate nella tabella utente. Poiché queste password vengono archiviate in database SQL, è necessario gestire manualmente la rotazione delle password.

Prerequisiti

Importante

Per usare connessioni senza password, aggiornare MS SQL Server Driver alla versione 12.1.0 o successiva e quindi creare un utente amministratore di Microsoft Entra per l'istanza del server database SQL di Azure. Per altre informazioni, vedere la sezione Creare un amministratore di Microsoft Entra in Esercitazione: Proteggere un database in database SQL di Azure.

Vedere l'applicazione di esempio

In questa esercitazione verrà codificata un'applicazione di esempio. Per procedere più rapidamente, è possibile usare l'applicazione già pronta, disponibile all'indirizzo https://github.com/Azure-Samples/quickstart-spring-data-jpa-sql-server.

Configurare una regola del firewall per il server di database SQL di Azure

Le istanze del database SQL di Azure sono protette per impostazione predefinita. Includono un firewall che non consente alcuna connessione in ingresso.

Per poter usare il database, aprire il firewall del server per consentire all'indirizzo IP locale di accedere al server di database. Per altre informazioni, vedere Esercitazione: Proteggere un database in database SQL di Azure.

Se ci si connette al server database SQL di Azure da sottosistema Windows per Linux (WSL) in un computer Windows, è necessario aggiungere l'ID host WSL al firewall.

Creare un utente non amministratore del database SQL e concedere l'autorizzazione

Questo passaggio creerà un utente non amministratore e concederà tutte le autorizzazioni per il demo database.

Per usare connessioni senza password, vedere Esercitazione: Proteggere un database in database SQL di Azure o usare Service Connessione or per creare un utente amministratore di Microsoft Entra per il server database SQL di Azure, come illustrato nei passaggi seguenti:

  1. Installare prima di tutto l'estensione senza password del servizio Connessione or per l'interfaccia della riga di comando di Azure:

    az extension add --name serviceconnector-passwordless --upgrade
    
  2. Usare quindi il comando seguente per creare l'utente non amministratore di Microsoft Entra:

    az connection create sql \
        --resource-group <your-resource-group-name> \
        --connection sql_conn \
        --target-resource-group <your-resource-group-name> \
        --server sqlservertest \
        --database demo \
        --user-account \
        --query authInfo.userName \
        --output tsv
    

L'amministratore di Microsoft Entra creato è un utente amministratore del database SQL, quindi non è necessario creare un nuovo utente.

Importante

Le connessioni senza password del database SQL di Azure richiedono l'aggiornamento del driver MS SQL Server alla versione 12.1.0 o successiva. L'opzione di connessione è authentication=DefaultAzureCredential in versione 12.1.0 e authentication=ActiveDirectoryDefault nella versione 12.2.0.

Archiviare dati da database SQL di Azure

Con un'istanza di database SQL di Azure è possibile archiviare i dati usando Spring Cloud Azure.

Per installare il modulo Spring Cloud Azure Starter, aggiungere le dipendenze seguenti al file pom.xml :

  • Spring Cloud Azure Bill of Materials (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>
    

    Nota

    Se si usa Spring Boot 2.x, assicurarsi di impostare la spring-cloud-azure-dependencies versione su 4.17.0. Questa distinta base deve essere configurata nella <dependencyManagement> sezione del file di pom.xml . In questo modo tutte le dipendenze di Spring Cloud Azure usano la stessa versione. Per altre informazioni sulla versione usata per questa distinta base, vedere La versione di Spring Cloud azure da usare.

  • Artefatto Spring Cloud Azure Starter:

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

    Nota

    Poiché si tratta di una dipendenza, deve essere aggiunta nella <dependencies> sezione del pom.xml. La versione non è configurata qui, perché è gestita dalla distinta base aggiunta in precedenza.

Configurare Spring Boot per l'uso del database SQL di Azure

Per archiviare dati da database SQL di Azure usando Spring Data JPA, seguire questa procedura per configurare l'applicazione:

  1. Configurare un database SQL di Azure credenziali nel file di configurazione application.properties.

    logging.level.org.hibernate.SQL=DEBUG
    
    spring.datasource.url=jdbc:sqlserver://sqlservertest.database.windows.net:1433;databaseName=demo;authentication=DefaultAzureCredential;
    
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServer2016Dialect
    spring.jpa.hibernate.ddl-auto=create-drop
    

    Avviso

    La proprietà di configurazione spring.jpa.hibernate.ddl-auto=create-drop indica che Spring Boot creerà automaticamente uno schema del database all'avvio dell'applicazione e proverà a eliminarlo all'arresto. Questa funzionalità è ideale per i test, ma tenere presente che eliminerà i dati a ogni riavvio, quindi non è consigliabile usarli nell'ambiente di produzione.

  1. Creare una nuova Todo classe Java. Questa classe è un modello di dominio mappato alla todo tabella che verrà creato automaticamente da JPA. Il codice seguente ignora i getters metodi 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. Modificare il file della classe di avvio per visualizzare il contenuto seguente.

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

    Suggerimento

    In questa esercitazione non sono presenti operazioni di autenticazione nelle configurazioni o nel codice. Tuttavia, la connessione ai servizi di Azure richiede l'autenticazione. Per completare l'autenticazione, è necessario usare Identità di Azure. Spring Cloud Azure usa DefaultAzureCredential, che la libreria di identità di Azure fornisce per ottenere le credenziali senza modifiche al codice.

    DefaultAzureCredential supporta più metodi di autenticazione e determina il metodo da usare in fase di esecuzione. Questo approccio consente all'app di usare metodi di autenticazione diversi in ambienti diversi (ad esempio ambienti locali e di produzione) senza implementare codice specifico dell'ambiente. Per altre informazioni, vedere DefaultAzureCredential.

    Per completare l'autenticazione negli ambienti di sviluppo locali, è possibile usare l'interfaccia della riga di comando di Azure, Visual Studio Code, PowerShell o altri metodi. Per altre informazioni, vedere Autenticazione di Azure in ambienti di sviluppo Java. Per completare l'autenticazione negli ambienti di hosting di Azure, è consigliabile usare l'identità gestita assegnata dall'utente. Per altre informazioni, vedere Informazioni sulle identità gestite per le risorse di Azure

  3. Avviare l’applicazione. Verranno visualizzati log simili all'esempio seguente:

    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
    

Distribuire in Azure Spring Apps

Ora che l'applicazione Spring Boot è in esecuzione in locale, è possibile spostarla nell'ambiente di produzione. Azure Spring Apps semplifica la distribuzione di applicazioni Spring Boot in Azure senza modifiche al codice. Il servizio gestisce l'infrastruttura delle applicazioni Spring per consentire agli sviluppatori di concentrarsi sul codice. Azure Spring Apps offre la gestione del ciclo di vita usando monitoraggio e diagnostica completi, gestione della configurazione, individuazione dei servizi, integrazione CI/CD, distribuzioni blu-verde e altro ancora. Per distribuire l'applicazione in Azure Spring Apps, vedere Distribuire la prima applicazione in Azure Spring Apps.

Passaggi successivi