본 글은 인프런의 김영한님 강의 자바 ORM 표준 JPA 프로그래밍 - 기본편
을 수강하며 기록한 필기 내용을 정리한 글입니다.
-> 인프런
-> 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의
@MappedSuperclass
어노테이션은 JPA에서 반복되는 필드를 하나로 묶어주는 역할을 한다.BaseEntity
클래스에 @MappedSuperclass
어노테이션을 적용하고, 반복되는 필드들을 구성해 둔다.User
, Team
, Class
)이 BaseEntity
클래스를 상속받는다.BaseEntity
클래스를 상속받은 클래스들은 모두 해당 필드들을 갖게 되며, DB에 각자의 컬럼으로 설정된다.< BaseEntity >
@MappedSuperclass
public abstract class BaseEntity {
@Id
@GeneratedValue
@Column(name = "ID")
private Long id;
@Column(name = "NAME")
private String name;
@Column(name = "CREATED_DATE")
private LocalDateTime createdDate;
@Column(name = "LAST_MODIFIED_DATE")
private LocalDateTime lastModifiedDate;
}
< User >
@Entity
public class User extends BaseEntity {
@Column(name = "EMAIL")
private String email;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
< Team >
@Entity
public class Team extends BaseEntity {
@OneToOne
@JoinColumn(name = "LEADER_ID")
private User user;
}
< Class >
@Entity
public class Class extends BaseEntity {
@Column(name = "PROFESSOR")
private String professor;
@Column(name = "MAJOR")
private String major;
}
@MappedSuperclass
로 설정된 필드들을 재정의하고 싶을 경우, 다음 둘 중 하나를 활용하면 된다.@AttributeOverride
@AttributeOverrides
@Entity
@AttributeOverrides({
@AttributeOverride(name = "id", column = @Column(name = "USER_ID")),
@AttributeOverride(name = "name", column = @Column(name = "USER_NAME"))
})
public class User extends BaseEntity{
...
@MappedSuperclass
는 JPA 내에서 상속이 이루어지지만, 이전 글에서 다루었던 상속관계 매핑과는 아무 관련이 없다.
@MappedSuperclass
어노테이션을 적용한 클래스는 엔티티가 아니다.
@Entity
어노테이션을 적용하지 않았으니 당연하다.상속을 통해 자식 클래스에게 매핑 정보만 제공해 주는 것이다.
조회, 검색이 불가능하다.
entityManager.find(BaseEntity.class, ...)
안된다.객체를 직접 만들어 사용할 일이 없으므로 웬만하면 추상 클래스로 만드는게 좋다.
@MappedSuperclass
public abstract class BaseEntity {
...
주로 등록일, 수정일, 등록자, 수정자 등과 같이 전체 엔티티에서 공통으로 활용되는 필드를 한 곳으로 모아 관리할 때 사용된다.
<참고 사항>
@Entity
어노테이션이 적용된 클래스는 다음 두 가지로 지정된 클래스만 상속받을 수 있다.
@Entity
어노테이션이 적용된 클래스@MaapedSuperclass
어노테이션이 적용된 클래스