JPA 연관 관계 - @MappedSuperclass

목차

공통 Mapping 정보를 관리하기 위한 MappedSuperclass

Entity 에 공통적으로 들어가는 Mapping 정보를 관리해 코드가 중복해서 작성하는 것을 방지하기 위해 사용하는 어노테이션

  • 상속관계 Mapping 이 아니다.
  • 부모 클래스를 상속 받는 자식 클래스에 Mapping 정보만 을 제공한다.
  • 직접 생성해서 사용할 일이 없으므로 추상클래스(abstract) 를 사용하는 것이 좋다.
  • MappedSuperclass 클래스를 상속 받기 위해서는 같은 @MappedSuperclass 를 사용한 클래스나 @Entity 을 이용한 클래스만 상속이 가능하다.

요구 사항

모든 Entity 에는 생성자, 생성일, 수정자, 수정일 정보가 들어가야 한다.

모든 Entity 에 공통적으로 들어가는 Mapping 정보 를 관리하기 위한 BaseEntity 클래스를 생성한다.

@MappedSuperclass
public abstract class BaseEntity {

private String createdBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
}

공통 Mapping 정보는 상속 을 통해 현재 Entity 에 적용할 수 있다.

Member 테이블이 생성될 때 공통 Mapping 가 적용될 수 있도록 BaseEntity 를 상속 받는다.

@Entity
public class Member extends BaseEntity {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MEMBER_ID")
private long id;

@Column(name = "USERNAME")
private String username;

@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;

public void changeTeam(Team team){
this.team = team;
team.getMembers().add(this);
}
}

Member 테이블이 생성될 때 createdBy, createdDate, lastModifiedBy, lastModifiedDate 컬럼이 생성된 것을 확인할 수 있다.

Team 테이블이 생성될 때 공통 Mapping 가 적용될 수 있도록 BaseEntity 를 상속 받는다.

@Entity
public class Team extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "TEAM_ID")
private Long id;
private String name;

@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();

public void addMember(Member member){
member.setTeam(this);
members.add(member);
}
}

Team 테이블이 생성될 때 createdBy, createdDate, lastModifiedBy, lastModifiedDate 컬럼이 생성된 것을 확인할 수 있다.

Share