스프링 버전 2.7.6
자바 JDK11
IDE intellij
DB 에 CRUD(create read update delete) 작업을 할 때, 이전과 이후로 나눠 작업을 추가할 수 있습니다! pre가 붙은것은 이전, post가 붙은건 이후입니다!
PostLoad: 엔티티가 영속성 컨텍스트에 조회된 직후
PrePersist: 새로운 인스턴스를 merge할 때 수행. persist() 메소드를 호출해서 엔티티를 영속성 컨텍스트에 관리하기 직전에 호출 // insert
PreUpdate: flush, commit를 호출해서 엔티티를 데이터베이스에 수정하기 직전에 호출 // update
PreRemove: remove 메소드를 호출해서 엔티티를 영속성 컨텍스트에서 삭제하기 직전에 호출 // delete
PostPersist: flush, commit를 호출해서 엔티티를 데이터베이스에 저장한 직후에 호출
PostUpdate: flush, commit를 호출해서 엔티티를 데이터베이스에 수정한 직후에 호출
PostRemove: remove 메소드를 호출해서 엔티티를 영속성 컨텍스트에서 삭제한 직후에 호출
예제
users 테이블에 데이터가 insert 될 때 자동으로 reg_date에 현재시간,
update 될 때 update+date에 자동으로 현재시간을 등록해보자!
CreatedDate : insert될때 자동으로 넣어줌
LastModifiedDate: update될때 자동으로 넣어줌
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@EntityListeners(AuditingEntityListener.class)
public class Users extends BaseEntity implements Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String userid;
private String userpw;
private String name;
private String hp;
private String email;
@Enumerated(EnumType.STRING)
private UserStatus status;
private List<OrderGroup> orderGroups;
private LocalDateTime regDate;
private LocalDateTime updateDate;
@PrePersist
public void PrePersist(){
System.out.println("PrePersist!");
this.regDate = LocalDateTime.now();
this.updateDate = LocalDateTime.now();
}
@PreUpdate
public void PreUpdate(){
System.out.println("PreUpdate!");
this.updateDate = LocalDateTime.now();
}
}
위와 같은 상황이 많다면 다른 엔티티에서도 재활용해주기 위해 인터페이스와 베이스가 되는 엔티티를 만들어서 설정해줄 수 있다.
인터페이스
package com.koreait.day5.model.config;
import java.time.LocalDateTime;
public interface Auditable {
LocalDateTime getRegDate();
LocalDateTime getUpdateDate();
void setRegDate(LocalDateTime regDate);
void setUpdateDate(LocalDateTime updateDate);
}
베이스 엔티티로
package com.koreait.day5.model.config;
import lombok.Data;
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;
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
@CreatedDate
private LocalDateTime regDate;
@LastModifiedDate
private LocalDateTime updateDate;
}
결과
@ToString(callSuper = true) //부모의 toString을 사용하기 위해
@EqualsAndHashCode(callSuper = true)//Generating equals/hashCode 에러 없애는 방법
이걸 쓰면 아래 CreatedDate/LastModifiedDate해줄필요 없음
인터페이스에 getter/setter만들고 클래스에서 @Data로 구현
regDate/updateDate를 지우고, extends BaseEntity implements Auditable해준다.
@ToString(callSuper = true) //부모의 toString을 사용하기 위해
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@ToString(callSuper = true) //부모의 toString을 사용하기 위해
@EqualsAndHashCode(callSuper = true)//Generating equals/hashCode 에러 없애는 방법
@EntityListeners(AuditingEntityListener.class)
public class Users extends BaseEntity implements Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String userid;
private String userpw;
private String name;
private String hp;
private String email;
@Enumerated(EnumType.STRING)
private UserStatus status;
private List<OrderGroup> orderGroups;
//private LocalDateTime regDate;
//private LocalDateTime updateDate;
}