본문 바로가기

CS 잡지식

@Column(updateable , insertable .... ), @PrePersist, @PreUpdate

 @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());


}