문제 상황
아래는 UserEntity 코드이다. 25번~28번 라인쪽을 보면
created_at, updated_at를 가지고 있는데, 이 두 필드는 UserEntity뿐만 아니라 FriendEntity, LogEntity와 같은 모든 Entity에 공통으로 들어가게 될 필드이다.
유지보수를 위해 created_at, updated_at와 같은 공통된 필드를 가지고 있는 BaseEntity를 만들고 UserEntity에서 이를 상속받아 사용할 수 있다.
package carrotbat410.lol.entity;
import jakarta.persistence.MappedSuperclass;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import java.time.LocalDateTime;
@MappedSuperclass
public abstract class BaseEntity {
@CreationTimestamp
private LocalDateTime created_at;
@UpdateTimestamp
private LocalDateTime updated_at;
public BaseEntity() {
this.updated_at = LocalDateTime.now();
}
}
공통 필드를 가지는 BaseEntity를 만들고, @MappedSuperclass을 붙여준다.
이떄 직접 생성해서 사용할 일은 없으므로, 추상 클래스로 만드는것을 권장한다.
package carrotbat410.lol.entity;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Getter
@Table(name = "users")
public class UserEntity extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String username;
private String password;
private String role;
public UserEntity(String username, String password, String role) {
this.username = username;
this.password = password;
this.role = role;
}
}
만든 BaseEntity를 상속받으면 된다.
목적이였던 공통 필드가 중복되는 문제를 해결하였다. 다른 Entity에서는 상속만 받으면 된다.
Hibernate:
drop table if exists users
Hibernate:
create table users (
id integer not null auto_increment,
created_at datetime(6),
updated_at datetime(6),
password varchar(255),
role varchar(255),
username varchar(255),
primary key (id)
) engine=InnoDB
created_at, updated_at 컬럼이 잘 생성된 걸 확인할 수 있다.