Last modified: October 13, 2023
·
3 min read

Spring Data JPA Auditing: Tracciare le Modifiche alle Entità

In questo tutorial esploriamo le funzionalita di auditing di Spring Data JPA. Vedremo come tracciare le modifiche apportate alle entità del database. Questa funzione e particolarmente utile per le applicazioni che richiedono una traccia di audit o che vogliono monitorare nel tempo le modifiche alle entità.

1. Prerequisiti

  • Conoscenza di Java e Spring Boot.
  • Progetto Spring Boot con Spring Data JPA e un database configurato.

2. Introduzione al JPA Auditing

Spring Data JPA Auditing fornisce annotazioni che popolano automaticamente campi come:

  • @CreatedBy e @LastModifiedBy: tracciano l'utente che ha creato o modificato per ultimo l'entità.
  • @CreatedDate e @LastModifiedDate: registrano il timestamp di creazione e modifica.

3. Configurazione del JPA Auditing

  • Aggiungi le dipendenze: assicurati di avere la dipendenza spring-boot-starter-data-jpa nel tuo pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
  • Abilita il JPA Auditing: per attivare l'auditing, annota la classe principale dell'applicazione o una classe di configurazione con @EnableJpaAuditing
@SpringBootApplication
@EnableJpaAuditing
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

4. Creazione delle Entità Auditabili

  • Classe base per l'audit: crea una classe base da cui le altre entità possono ereditare. Questa classe conterra i campi relativi all'audit
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Auditable<U> {

    @CreatedBy
    protected U createdBy;

    @CreatedDate
    protected LocalDateTime createdDate;

    @LastModifiedBy
    protected U lastModifiedBy;

    @LastModifiedDate
    protected LocalDateTime lastModifiedDate;

    // Getter e setter...
}
  • Utilizzo della classe audit: per rendere un'entità auditabile, estendi la classe base
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Book extends Auditable<String> {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    // Getter, setter e altri campi...
}

5. Visualizzazione dei Dati di Audit

Con i campi di audit popolati automaticamente, puoi facilmente recuperare e mostrare queste informazioni nei tuoi servizi o controller. Ad esempio:

@RestController
@RequestMapping("/books")
public class BookController {

    @Autowired
    private BookRepository bookRepository;

    @GetMapping("/{id}/audit")
    public ResponseEntity<?> getAuditData(@PathVariable Long id) {
        return bookRepository.findById(id)
                .map(book -> ResponseEntity.ok(Map.of(
                        "createdBy", book.getCreatedBy(),
                        "createdDate", book.getCreatedDate(),
                        "lastModifiedBy", book.getLastModifiedBy(),
                        "lastModifiedDate", book.getLastModifiedDate())))
                .orElse(ResponseEntity.notFound().build());
    }
}

6. Conclusione

Spring Data JPA Auditing semplifica il processo di tracciamento delle modifiche alle entità nella tua applicazione. Sfruttando poche annotazioni e una classe base di audit, le entità possono acquisire automaticamente i metadati essenziali sulla loro creazione e modifica. C'e molto altro da esplorare, tra cui l'integrazione con Spring Security per un tracciamento degli utenti piu completo.