@PrePersist
JPA에서 persist()가 호출이 되면, 그 전에 @PrePersist가 붙은 메서드가 실해이 된다.
@PreUpdate : JPA에서 Dirty Checking에 의해서 변경이 돼서, Context에 있는 쿼리가 날라 가기 직전에 ,
@PrePersist가 붙은 메서드가 실해이 된다.
MappedSuperclass // 이 클래스는 진짜 [부모] 클래스로서 상속시키는 것이 아니라, 그냥 속성만 내려 받겠다는 에노테이션!
@Getter
public class JpaBaseEntity {
@Column(updatable = false) // createdDate는 [수정]이 불가능!
private LocalDateTime createdDate; // 등록일
private LocalDateTime updatedDate; // 수정일일
@PrePersist // JPA에서 persist()가 호출이 되면, 그 전에 @PrePersist가 붙은 메서드가 실해이 된다.
public void prePersist(){
LocalDateTime now = LocalDateTime.now();
this.createdDate = now;
this.updatedDate = now; // 최초 등록일은 또 다른 시각으로는 최초 [수정일]로도 볼 수가 있다.
// 무엇보다 sql문에 null이 들어 가는 것은 그렇게 좋지가 않다고 한다.
}
@PreUpdate
public void preUpdate() {
updatedDate = LocalDateTime.now();
}
@Entity
public class Member extends JpaBaseEntity{ // 등록일,수정일 정보가 필요하므로, JpaBaseEntity를 상속 받았다.
//이하 생략
}
@Test
@Transactional
void JpaEventBaseEntity() throws Exception {
//givien
Member member = new Member("member1");
memberReposiotry.save(member); // persist() 실행 전에, @PrePersist가 붙은 메서드가 실행
Thread.sleep(100);
member.setUsername("member2"); //Dirty Checking으로 Update됨을 감지!
entityManager.flush(); // @PreUpdate가 실행된다.
entityManager.clear();
//when
Member member1 = memberReposiotry.findById(member.getId()).get();
//then
System.out.println("member1 getCreatedDate() = " + member1.getCreatedDate());
System.out.println("member1 getUpdatedDate() = " + member1.getUpdatedDate());
}
'CS 잡지식' 카테고리의 다른 글
요청 API에서 Paging 정보 넘기기!!! (0) | 2023.05.13 |
---|---|
[도메인 엔티티]로 API를 개발이 허용되는 유일한 경우! (0) | 2023.05.13 |
사용자 정의 인터페이스(feat. Spring Data JPA) (0) | 2023.05.12 |
Dirty Checking의 치명적인 Weakness(단점)(feat. hint,lock) (1) | 2023.05.12 |
SELECT ~~ FOR UPDATE(Feat. Concurrency Problem ) (0) | 2023.05.12 |