[JAVA] Qu'est-ce que l'audit JPA?

Qu'est-ce que l'audit JPA?

Lors du mappage d'un domaine à une table RDBS à l'aide de JPA, il existe des champs et des colonnes qui ont un domaine en commun.

C'est typiquement comme suit.

Il y a des champs et des colonnes comme celui-ci, non? Le fait qu'il existe pour chaque domaine signifie que le code est dupliqué. En effet, il est utile pour la maintenance de conserver une trace de qui a créé la base de données et quand. Par conséquent, les colonnes telles que la date de création et la date de modification sont des données vraiment importantes.

C'est pourquoi JPA propose une fonctionnalité appelée Audit. L'audit est une fonction que Spring Data JPA remplit automatiquement l'heure dans le sens de la surveillance. Lors de la mise à jour après avoir enregistré le domaine dans le contexte de persistance ou effectué une requête, vous devez entrer les données d'heure à chaque fois, mais en utilisant l'audit, l'heure est automatiquement mappée et elle est ajoutée à la table de la base de données. Je vais le mettre.

entraine toi

    1. Créez une classe BaseTimeEntity dans le package de domaine. image.png
  1. Créez un BaseTimeEntity comme suit.


package jojoidu.boot.springboot.domain;

import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
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;

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {

    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime modifiedDate;
}

La classe BaseTimeEntity devient la classe parente de toutes les classes Entity et joue le rôle de gérer automatiquement le createdDate et le modifiedDate de la classe ** Entity. ** **

    1. Héritez de la classe BaseTimeEntity de la classe Entity.

package jojoidu.boot.springboot.domain.posts;

import jojoidu.boot.springboot.domain.BaseTimeEntity;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@NoArgsConstructor
@Entity //Indique la classe liée à la table
public class Posts extends BaseTimeEntity {

    @Id //Indique le champ PK
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(length = 500, nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    private String author;

    @Builder
    public Posts(String title, String content, String author) {
        this.title = title;
        this.content = content;
        this.author = author;
    }

    public void update(String title, String content) {
        this.title = title;
        this.content = content;
    }
}


Quatre. Enfin, ajoutez l'annotation d'activation à la classe principale afin que l'annotation d'audit JPA soit activée.


package jojoidu.boot.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

tester

Les tests sont essentiels, j'ai donc également ajouté une méthode de test.


@Test
    public void saveBaseTimeEntity() {
        // given
        LocalDateTime now = LocalDateTime.of(2020, 8,12,0,0,0);
        postsRepository.save(Posts.builder()
        .title("title")
        .content("content")
        .author("author")
        .build());

        // when
        List<Posts> postsList = postsRepository.findAll();

        //then
        Posts posts = postsList.get(0);

        System.out.println(">>>>>>>createdDate=" + posts.getCreatedDate() + ", modifiedDate=" + posts.getModifiedDate());

        assertThat(posts.getCreatedDate()).isAfter(now);
        assertThat(posts.getModifiedDate()).isAfter(now);
    }

résultat

image.png J'ai pu confirmer que cela fonctionne normalement. Je suis trop content de m'amuser autant.

Recommended Posts

Qu'est-ce que l'audit JPA?
Qu'est-ce que Cubby
Qu'est-ce qui est nul? ]
Qu'est-ce que 'java
Qu'est-ce que Keycloak
Qu'est-ce que maven?
Qu'est-ce que Jackson?
Qu'est-ce que Jenkins
Qu'est-ce que ArgumentMatcher?
Qu'est-ce que IM-Juggling?
Qu'est-ce que les paramètres
Qu'est-ce que SLF4J?
Qu'est-ce que Java <>?
Qu'est-ce que Gradle?
Qu'est-ce que POJO
Qu'est-ce que 'java
Qu'est-ce que centOS
Qu'est-ce que RubyGem?
Qu'est-ce que before_action?
Qu'est-ce que Byte?
Qu'est-ce que Tomcat
Qu'est-ce que l'assemblage Maven?
Qu'est-ce qu'un constructeur
Qu'est-ce que vue cli
Qu'est-ce qu'une interface
Qu'est-ce que le moi de Ruby?
Qu'est-ce que le codage en dur?
Qu'est-ce qu'un flux
Qu'est-ce que l'attr_accessor de Ruby?
Qu'est-ce que l'encapsulation Java?
Qu'est-ce qu'une permission refusée?
Qu'est-ce que le contrôle d'instance?
Qu'est-ce qu'un initialiseur?
Qu'est-ce que Spring Tools 4
Qu'est-ce que l'orientation objet?
Qu'est-ce que le @VisibleForTesting de Guava?
Qu'est-ce qu'un modèle MVC?
Qu'est-ce qu'une annotation?
Qu'est-ce que la technologie Java?
Qu'est-ce que Java API-java
Qu'est-ce que @ (variable d'instance)?
Qu'est-ce que l'artefact de Gradle?
[Java] Qu'est-ce que flatMap?
Qu'est-ce qu'un servlet?
Qu'est-ce que le développement Web?
[Java] Qu'est-ce que ArrayList?
Qu'est-ce que HttpSession session = request.getSession ();
[Mémorandum] Qu'est-ce qu'une erreur?
Qu'est-ce qu'une classe wrapper?
Qu'est-ce qu'un type booléen?
Qu'est-ce qu'un module Ruby?