고급매핑
rdb 테이블을 매핑한 객체를 좀더 객체지향적으로 사용할 수 있도록 제공해주는 기능들
- 상속 관계 매핑
- 조인 테이블 전략
- 싱글 테이블 전략
- @MappedSuperclass
- 식별자 클래스
- @IdClass
- @EmbeddedId
상속관계매핑
테이블 구조를 마치 상속받는 것 처럼 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 |