stateDiagram-v2 [*] --> New: new Entity() New --> Managed: persist() Managed --> Detached: detach()/close() Managed --> Removed: remove() Detached --> Managed: merge() Managed --> [*]: clear() Removed --> [*]
2025-01-30
Source | |
Branch |
|
Java |
|
Docker |
|
Le cycle de vie d’une entité JPA définit les différents états possibles d’une instance (New
, Managed
, Detached
, Removed
) et les transitions entre ces états via les opérations de l’EntityManager (persist()
, merge()
, remove()
, detach()
), permettant ainsi le suivi et la gestion de la synchronisation entre les objets Java en mémoire et leur représentation en base de données.
stateDiagram-v2 [*] --> New: new Entity() New --> Managed: persist() Managed --> Detached: detach()/close() Managed --> Removed: remove() Detached --> Managed: merge() Managed --> [*]: clear() Removed --> [*]
Comme le cycle de vie des entités géré par JPA, des annotations spécifiques sont proposées pour exécuter des méthodes de Callback d’une entités à des moments spécifiques :
@PrePersist
: avant persist()
@PostPersist
: après persist()
@PreUpdate
: avant modification@PostUpdate
: après modification@PreRemove
: avant suppression@PostRemove
: après suppression@PostLoad
: après chargementDéfinir un ou des Listener
: des classes dédiées à la réaction aux évènements du cycle de vie d’une entités.
@Slf4j
public class EntityMonitorListener {
@PrePersist
@PreUpdate
@PreRemove
private void beforeAnyUpdate(Object entity) {
log.info("-->about to change in DB: " + entity);
}
@PostPersist
@PostUpdate
@PostRemove
private void afterAnyUpdate(Object entity) {
log.info("--> changed in DB" + entity);
}
@PostLoad
private void afterLoad(Object entity) {
log.info("--> loaded from DB: " + entity);
}
}
Les associer à une ou plusieurs entités (@EntityListeners
).
@Entity
@Table(name = "CUSTOMER_BIS")
@EntityListeners(EntityMonitorListener.class)
@Getter
@Setter
@ToString
@RequiredArgsConstructor(staticName = "of")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Slf4j
public class CustomerWithListener {
@Id
@GeneratedValue
private long id;
@NonNull
private String name;
}
E. Bruno - Le cycle de vie des entités JPA