[데브코스] JPA - 고급매핑 전략
Updated: Categories: TILW8D3 Part2 - 상속관계 매핑 / 식별자 클래스 전략에 대해 알아보자
상속관계 매핑
@Inheritance
어노테이션을 통해 엔티티 클래스간의 상속관계를 생성한다.- 하나의 컬럼이 여러 속성을 가져야할 때 사용!
Join Table
- 상위에 추상 객체를 두고 하위에 다른 엔티티를 구현한다
- 테이블간의 관계를 통한 여러 테이블이 생성된다.
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Item {
..필드들..
}
// 상위 엔티티를 상속받고 추가적으로 구현한다.
@Entity
public class Food extends Item {
private String chef;
}
...
- 상속 속성은
@Inheritance(strategy = InheritanceType.JOINED)
어노테이션을 붙여줘야한다.
Single Table
- 현업에서는 싱글테이블 전략을 많이 사용
- 조인관계를 관리하기 어렵기 때문
- 따라서 하나의 테이블에 모든 정보를 가지는 싱글 테이블 전략을 사용한다.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
..필드들..
}
// 상위 엔티티를 상속받고 추가적으로 구현한다.
@Entity
@DiscriminatorValue("FOOD")
public class Food extends Item {
private String chef;
}
...
- 상속 속성은
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
어노테이션을 붙여줘야한다. - 상위 엔티티에
@DiscriminatorColumn(name = "별명")
을 추가해주면 해당 별명을 통해 테이블이 생성됨 - 하위 엔티티에는 각자의 별명을 붙여준다.
@MappedSuperclass
- 다수의 엔티티가 공통된 필드를 가질 때 사용한다.
@MappedSuperclass
public class BaseEntity {
@Column( ... )
필드명
...
}
@Entity
public class Entity extends BaseEntity {
... 필드들 ...
}
- 공통된 필드들을 뽑아서
@MappedSuperclass
어노테이션을 붙인 클래스를 만들어준다. - 그리고 해당 클래스를 다른 클래스에 상속받으면 끝
식별자 클래스
@IdClass
- 식별자가 두개인 복합키를 사용하고 싶을때 사용한다.
- 이럴땐 식별자 클래스를 따로 만들어 준다.
- 다음과 같은 규칙을 따라야 한다.
- 엔티티의 식별자 필드명은 반드시 식별자 클래스의 필드명과 동일해야 함
- Serializable 인터페이스를 구현해야 한다.
- eqauls, hashCode를 구현해야 한다.
- 기본 생성자가 있어야 한다.
- 식별자 클래스는 public 이어야 한다.
// 엔티티 클래스
@Getter
@Setter
@Entity
@IdClass(ParentId.class) // 식별자 클래스를 지정해준다.
public class Parent {
@Id
private String id1;
@Id
private String id2;
}
// 식별자 클래스
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class ParentId implements Serializable {
private String id1;
private String id2;
}
@EmbeddedId
- 식별자 클래스 방식에서 좀 더 객체지향스럽게 변경한 방식
- 엔티티 객체에 식별자 필드들을 따로 생성하지 않고 객체 자체로 가지고 있음.
- 식별자 클래스에는
@Embeddable
어노테이션을 붙여줘야함
// 엔티티 클래스
@Getter
@Setter
@Entity
public class Parent {
// 복합키 객체를 추가한다.
@EmbeddedId
private ParentId id;
}
// 식별자 클래스
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
public class ParentId implements Serializable {
private String id1;
private String id2;
}