여러 객체/테이블에 공통으로 들어가는 정보들이 있을때, 해당 Column들을 해당 객체/테이블들에 쉽게 생성할 수 있게 해주는 애노테이션
상속관계 매핑이 아니며, 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공합니다.
조회, 검색 불가(em.find(BaseEntity) 불가)
@MappedSuperclass
public abstract class BaseEntity{
private String createdBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
@Column(name = "update_date") //@Column 애너테이션을 통해 BaseEntity를 상속받는 모든 테이블들의 lastModifiedDate column을 필요한 대로 한번에 바꿀수 있음
private LocalDateTime lastModifiedDate;
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public LocalDateTime getCreatedDate() {
return createdDate;
}
public void setCreatedDate(LocalDateTime createdDate) {
this.createdDate = createdDate;
}
public String getLastModifiedBy() {
return lastModifiedBy;
}
public void setLastModifiedBy(String lastModifiedBy) {
this.lastModifiedBy = lastModifiedBy;
}
public LocalDateTime getLastModifiedDate() {
return lastModifiedDate;
}
public void setLastModifiedDate(LocalDateTime lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}
}
@Entity
@Table(name = "ORDERS")
public class Order extends BaseEntity{
@Id
@GeneratedValue() //Default strategy = auto
@Column(name = "ORDER_ID")
private Long id;
@OneToOne
@JoinColumn(name = "DELIVERY_ID")
private Delivery delivery;
@ManyToOne // N:1 관계; Member가 여러개의 주문을 할 수 있지만, 주문서는 하나의 Member랑만 연관 되어 있음
@JoinColumn(name = "MEMBER_ID") // ... member m JOIN orders o ON m.MEMBER_ID = o.MEMBER_ID;
private Member memberId; // memberId에 Member 객체 자체를 주입 함
private LocalDateTime orderDate;
@Enumerated(value = EnumType.STRING)
private OrderStatus status;
@OneToMany(mappedBy = "orderId")
private List<OrderItem> orderItemList = new ArrayList<>();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Member getMemberId() {
return memberId;
}
public void setMemberId(Member memberId) {
this.memberId = memberId;
}
public LocalDateTime getOrderDate() {
return orderDate;
}
public void setOrderDate(LocalDateTime orderDate) {
this.orderDate = orderDate;
}
public OrderStatus getStatus() {
return status;
}
public void setStatus(OrderStatus status) {
this.status = status;
}
}
부모 클래스인 BaseEntity 객체를 만들고, @MappedSuperClass 애노테이션을 추가해줍니다.
자식 클래스가 부모 클래스(BaseEntity)를 extends로 상속 받으면, 자동으로 부모 클래스의 column들이 자식 클래스에 추가됩니다.
이때, 부모 클래스에 대한 테이블은 생성이 되지 않습니다. 그렇기 때문에, @MappedSuperClass는 상속 관계 매핑과는 다른 개념입니다.**