본문 바로가기

TIL

[TIL] 210929

고급매핑

rdb 테이블을 매핑한 객체를 좀더 객체지향적으로 사용할 수 있도록 제공해주는 기능들

  • 상속 관계 매핑
    • 조인 테이블 전략
    • 싱글 테이블 전략
  • @MappedSuperclass
  • 식별자 클래스
    • @IdClass
    • @EmbeddedId

상속관계매핑

img

테이블 구조를 마치 상속받는 것 처럼 extends를 이용해 작성하는 전략

조인 테이블 전략

부모 클래스의 공통된 정보는 한 테이블에서 관리하고,
나머지 각 자식 클래스의 정보들은 다른 클래스에서 별도로 관리

 

// 부모 클래스
@Entity
@Table(name = "item")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Item {
    ...
}

 

@Inheritance 애노테이션에서 JOINED를 사용함

@Entity
public class Food extends Item {
    ...
}

 

ITEM 테이블

 


food 테이블

 

car 테이블

 

 

 

 

싱글 테이블 전략

 

모든 자식 클래스들의 멤버변수들을 한 테이블의 column으로 두고
@DiscriminatorColumn 에 정의한 이름으로 클래스 종류를 구분한다.

 

//부모 클래스
@Entity
@Table(name = "item")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
    ...
}

 

@Inheritance 애노테이션에서 SINGLE_TABLE을 사용함

@DiscriminatorColumn에 적용한 값은 테이블의 column 값으로 생성된다.

 

//자식 클래스
@Entity
@DiscriminatorValue("FOOD")
public class Food extends Item{
    ...
}

 

@DiscriminatorValue에 적용한 값은 테이블의 필드값으로 들어간다.

item 테이블

 

@MappedSuperClass

공통으로 자주 사용되는 column을 클래스로 생성하고
다른 클래스들에서 해당 클래스를 상속받아
추가적인 작성 없이 column을 관리할 수 있음

 

//부모 클래스
@MappedSuperclass
public class BaseEntity {

    @Column(name = "created_by")
    private String createdBy;

    @Column(name = "created_at", columnDefinition = "TIMESTAMP")
    private LocalDateTime cratedAt;

}

 

 

//자식 클래스
@Entity
@Table(name = "orders")
public class Order extends BaseEntity {
    ...
}

 

Order 클래스에서도 createdBy, cratedAt을 사용할 수 있고,

orders 테이블에도 자동으로 column값으로 생성된다.

 

 

 

 

식별자 클래스

1차캐시에서 식별자를 1개를 가지고 관리하기 때문에,
식별자가 2개 이상일 경우 별도의 식별자 클래스를 만들어 관리한다.

 

@IdClass

  • Serializable 인터페이스를 구현해야 한다.
  • eqauls, hashCode를 구현해야 한다.
  • 기본 생성자가 있어야 한다.
  • 식별자 클래스는 public 이어야 한다.
  •  
//id 클래스
@EqualsAndHashCode
@NoArgsConstructor
public class ParentIdClass implements Serializable {
    private String id1;
    private String id2;
}

 

 

@Getter
@Setter
@Entity
@IdClass(ParentId.class)
public class Parent {
    @Id
    private String id1;
    @Id
    private String id2;
}

 

IdClass를 사용하는 클래스에서는 IdClass에서 작성한 변수들과 일치하게 @Id를 작성해주어야 한다.

 

 

 

@EmbeddedId

--> 사용 추천

  • Serializable 인터페이스를 구현해야 한다.
  • eqauls, hashCode를 구현해야 한다.
  • 기본 생성자가 있어야 한다.
  • 식별자 클래스는 public 이어야 한다.
  • @Embeddable 애노테이션이 있어야 한다.

 

// id 클래스
@EqualsAndHashCode
@NoArgsConstructor
@Embeddable
public class ParentEmbeddedId implements Serializable {
    private String id1;
    private String id2;
}

 

 

@Entitypublic class Parent {    @EmbeddedId    private ParentEmbeddedId id;}

'TIL' 카테고리의 다른 글

[TIL] 220121  (0) 2022.01.21
[TIL] 220112  (0) 2022.01.12
[TIL] 210810  (0) 2021.08.10
[TIL] 210809  (0) 2021.08.10
[TIL] 210806  (0) 2021.08.09