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.
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. ** **
@MappedSuperclass --Lorsque la classe d'entité JPA hérite de BaseTimeEntity, assurez-vous que les champs (createdDate, modifiedDate) sont également reconnus comme des colonnes.
@EntityListeners(AuditingEntityListener.class)
Donner la fonction d'audit à la classe BaseTimeEntity.
@CreatedDate
L'heure est automatiquement enregistrée lorsque l'entité est créée et enregistrée.
@LastModifiedDate
L'heure est automatiquement enregistrée lorsque vous modifiez la valeur de l'entité que vous avez interrogée.
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);
}
}
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);
}
J'ai pu confirmer que cela fonctionne normalement. Je suis trop content de m'amuser autant.
Recommended Posts