Avancadas

Executáveis

Conhecendo as anotações executáveis do JPA

Introdução

@Executáveis

O JPA oferece diversas anotações que permitem interceptar eventos durante o Ciclo de Vida da Entidade. Entre elas, as anotações @PrePersist, @PreUpdate, @PostPersist e @PostUpdate são úteis para executar ações antes ou depois da persistência e atualização das entidades.

Cenário

Vamos elaborar uma apresentação sobre o uso das anotações @PrePersist, @PreUpdate, @PostPersist e @PostUpdate no JPA. A apresentação incluirá uma explicação introdutória sobre essas anotações, seguida de um exemplo prático. O exemplo abordará um cadastro de Clientes, contendo os campos id, nome, dataInclusao e dataAlteracao, sendo que as datas de inclusão e alteração serão definidas automaticamente no momento da persistência. Além disso, o campo localizacao será uma combinação do id e nome, gerado após a persistência do cliente.

import javax.persistence.*;
import java.time.LocalDate;

@Entity
public class Cliente {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private LocalDate dataInclusao;
    private LocalDate dataAlteracao;
    private String localizacao;
    
    @PrePersist
    private void prePersist() {
        this.dataInclusao = LocalDate.now(); // Define a data de inclusão com a data atual
    }

    @PreUpdate
    private void preUpdate() {
        this.dataAlteracao = LocalDate.now(); // Define a data de alteração com a data atual
    }

    @PostPersist
    private void postPersist() {
        this.localizacao = gerarLocalizacao(); // Gera a localização após a persistência
    }

    @PostUpdate
    private void postUpdate() {
        this.localizacao = gerarLocalizacao(); // Atualiza a localização após a atualização
    }

    private String gerarLocalizacao() {
        return id + "_" + nome; // Combina o id com o nome para gerar a localização
    }

    // Lombok ou Getters e Setters
    
}

Explicação

  1. @PrePersist:
  • Executada antes da persistência do objeto no banco de dados.
  • Usada para definir o campo dataInclusao com a data atual e gerar o campo localizacao.
  1. @PreUpdate:
  • Executada antes de atualizar o objeto no banco de dados.
  • Usada para definir o campo dataAlteracao com a data atual.
  1. @PostPersist:
  • Executada depois da persistência no banco de dados.
  • Aqui, ela é usada para garantir que o campo localizacao tenha o valor correto após a persistência.
  1. @PostUpdate:
  • Executada depois da atualização no banco de dados.
  • Garantimos que o campo localizacao seja atualizado sempre que a entidade for alterada.