tonykang22 / study

0 stars 0 forks source link

[JPA] 7장. 고급 매핑 #139

Open tonykang22 opened 1 year ago

tonykang22 commented 1 year ago

7장. 고급 매핑

상속 관계 매핑

image image



조인 전략

image



예시

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {

    @Id @GeneratedValue
    @Column(name = "ITEM_ID")
    private Long id;

    private String name; 
    private int price;
    ...
}

@Entity
@DiscriminatorValue("A")
public class Album extends Item {

    private String artist;
    ...
}

@Entity
@DiscriminatorValue("M")
public class Movie extends Item {

    private String director;
    ...
}



단일 테이블 전략

image



구현 클래스마다 테이블 전략

image

@MappedSuperclass

image



예시

@MappedSuperclass
public abstract class BaseEntity {

    @Id @GeneratedValue
    private Long id;
    private String name;
    ...
}

// 부모로부터 물려받은 매핑 정보를 재정의하려면 아래와 같이 사용할 수 있다.
// @AttributeOverride(name = "id", column = @Column(name = "MEMBER_ID"))
@Entity
public class Member extends BaseEntity {

    // ID, NAME 상속
    private String email;
    ...
}

@Entity
public class Seller extends BaseEntity {

    // ID, NAME 상속
    private String shopName;
    ...
}



복합 키와 식별 관계 매핑


식별 관계 vs 비식별 관계


식별 관계

image



비식별 관계

image



조인 테이블

image



일대일 조인 테이블

image


예시

@Entity
public class Parent {

    @Id
    @GeneratedValue
    @Column(name = "PARENT_ID")
    private Long id;
    private String name;

    @OneToOne
    @JoinTable(name = "PARENT_CHILD",
            joinColumns = @JoinColumn(name = "PARENT_ID"),
            inverseJoinColumns = @JoinColumn(name = "CHILD_ID"))
    private Child child;

    ...
}

@Entity
public class Child {

    @Id
    @GeneratedValue
    @Column(name = "CHILD_ID")
    private Long id;
    private String name;
    ...
}



일대다 조인 테이블

예시

@Entity
public class Parent {

    @Id
    @GeneratedValue
    @Column(name = "PARENT_ID")
    private Long id;
    private String name;

    @OneToMany
    @JoinTable(name = "PARENT_CHILD",
            joinColumns = @JoinColumn(name = "PARENT_ID"),
            inverseJoinColumns = @JoinColumn(name = "CHILD_ID"))
    private List<Child> child = new ArrayList<>();

    ...
}

@Entity
public class Child {

    @Id
    @GeneratedValue
    @Column(name = "CHILD_ID")
    private Long id;
    private String name;
    ...
}



다대일 조인 테이블

예시

@Entity
public class Parent {

    @Id
    @GeneratedValue
    @Column(name = "PARENT_ID")
    private Long id;
    private String name;

    @OneToMany(mappedBy = "parent")
    @JoinTable(name = "PARENT_CHILD",
            joinColumns = @JoinColumn(name = "PARENT_ID"),
            inverseJoinColumns = @JoinColumn(name = "CHILD_ID"))
    private List<Child> child = new ArrayList<>();

    ...
}

@Entity
public class Child {

    @Id
    @GeneratedValue
    @Column(name = "CHILD_ID")
    private Long id;
    private String name;

    @ManyToOne(optional = false)
    @JoinTable(name = "PARENT_CHILD",
            joinColumns = @JoinColumn(name = "CHILD_ID"),
            inverseJoinColumns = @JoinColumn(name = "PARENT_ID"))
    private Parent parent;
    ...
}



대다대 조인 테이블

예시

@Entity
public class Parent {

    @Id
    @GeneratedValue
    @Column(name = "PARENT_ID")
    private Long id;
    private String name;

    @ManyToMany
    @JoinTable(name = "PARENT_CHILD",
            joinColumns = @JoinColumn(name = "PARENT_ID"),
            inverseJoinColumns = @JoinColumn(name = "CHILD_ID"))
    private List<Child> child = new ArrayList<>();

    ...
}

@Entity
public class Child {

    @Id
    @GeneratedValue
    @Column(name = "CHILD_ID")
    private Long id;
    private String name;
    ...
}



엔티티 하나에 여러 테이블 매핑

image


예시

@Entity
@Table(name = "BOARD")
@SecondaryTable(name = "BOARD_DETAIL",
        pkJoinColumns = @PrimaryKeyJoinColumn(name = "BOARD_DETAIL_ID"))
public class Parent {

    @Id @GeneratedValue
    @Column(name = "BOARD_ID")
    private Long id;

    private String title;

    @Column(table = "BOARD_DETAIL")
    private String content;
    ...
}



정리