[데브코스] JPA - 고급매핑 전략

Updated: Categories:

W8D3 Part2 - 상속관계 매핑 / 식별자 클래스 전략에 대해 알아보자

상속관계 매핑

  • @Inheritance 어노테이션을 통해 엔티티 클래스간의 상속관계를 생성한다.
  • 하나의 컬럼이 여러 속성을 가져야할 때 사용!

Join Table

  • 상위에 추상 객체를 두고 하위에 다른 엔티티를 구현한다
  • 테이블간의 관계를 통한 여러 테이블이 생성된다.

image

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Item {
    ..필드들..
}

// 상위 엔티티를 상속받고 추가적으로 구현한다.
@Entity
public class Food extends Item {
    private String chef;
}
...
  • 상속 속성은 @Inheritance(strategy = InheritanceType.JOINED) 어노테이션을 붙여줘야한다.

Single Table

  • 현업에서는 싱글테이블 전략을 많이 사용
    • 조인관계를 관리하기 어렵기 때문
  • 따라서 하나의 테이블에 모든 정보를 가지는 싱글 테이블 전략을 사용한다.

image

@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;
}