JPA 를 사용을 하다 보면 두가지 테이블에서 중복된 컬럼이 있고 추후에 중복이
될 수 있는 컬럼이 있을 수도 있다
그런 상황에서 사용을 하고자 이제는@MappedSuperclass
을 사용을 하여서
클린 코드를 작성을 해보기 위한 글이다.
JPA 를 Entity 를 만들다 보면 중복 적인 컬럼을 만들 때가 있다
중복적인 매핑을 피하고자@MappedSuperclass
를 사용을 한다.
@Getter
@MappedSuperclass
@EntityListeners(value = {AuditingEntityListener.class})
public abstract class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Column(name = "create_date" , nullable = false , updatable = false)
protected LocalDate createDate;
@Column(name = "update_date" , nullable = false)
protected LocalDate updateDate;
@PrePersist
protected void onPersist() {
this.createDate = this.updateDate = LocalDate.now();
}
@PreUpdate
protected void onUpdate() {
this.updateDate = LocalDate.now();
}
}
id 의 경우 @GeneratedValue(strategy = GenerationType.IDENTITY) 로 설정시 시퀀스가 자동으로 증가한다.
createDate 의 경우 Row 데이터가 만들어질때 자동으로 들어간다
updateDate 의 경우 Row 데이터가 변경이될때 자동으로 들어간다
@PrePersist 의 경우 연속성관리하기 직전에 호출을 의미한다.
@PreUpdate 의 경우 flush , commit 시 호출 한다.
@Getter
@MappedSuperclass
@EntityListeners(value = {AuditingEntityListener.class})
public abstract class BoardBaseEntity extends BaseEntity{
@Column(name = "create_by" , updatable = false)
protected String createBy;
@Column(name = "update_by")
protected String updateBy;
}
아래와 같이
extends
를 사용을 하여서 BaseEntity 를 사용하면 클린하고 중복이 없는 코드를 작성 할 수 있을 것이다.
@Table(name="TEST")
@Entity
public class Test extends BaseEntity{
... 중략 ...
}