상속 관계 매핑

1.조인전략 : 엔티티를 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본키 를 받아서 외래키로 사용하는 전략

@Entity
@Inheritance(strategy = IngeritanceType.JOINED)  부모 클래스에 쓰는 매핑
@DiscriminatorColumn(name = DTYPE)  부모 클래스에 구분 컬럼을 지정
public abstract class Item {

}

@Entity
@DiscriminatorValue(A)  엔티티를 저장할  구분 컬럼에 입력할 값을 지정
@PrimayKeyJoinColumn(name = BOOK_ID)  자식 테이블의 기본  컬럼명을 변경하고 싶을 
public class Album extends Item {

}

2.단일 테이블 전략

  • 테이블 하나만 사용
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)


@Entity
@DiscriminatorValue(A)
public class Album extends Item {}
  • 구현 클래스마다 테이블 전략
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)


@MappedSuperclass

부모 클래스는 테이블과 매핑하지 않고 부모 클래스를 상속 받는 자식 클래스에게 매핑 정보만 제공하고 싶을 때

@MappedSuperclass
public abstract class BaseEntity {
    @Id @GeneratedValue
    private Long id;
    private String name;
}

@Entity
public class Member extends BaseEntity {
    //ID 상속
    //NAME 상속
    private String email;
    
}


부모로부터 물려받은 매핑 정보를 재정의하려면

@Entity
@AttributeOverrides({
    @AttributeOverride(name = id, column = @Column(name = MEMBER_ID)),
    @AttributeOverride(name = name, column = Column(name = MEMBER_NAME))
})
public class Member extends BaseEntity{}


복합 키와 식별 관계 매핑

  • 식별 관계 : 부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본키 + 외래키로 사용하는 관계
  • 비식별 관계 : 부모 테이블의 기본 키를 받아서 자식 테이블의 외래 키로만 사용


1.복합키:비식별 관계 매핑

@Entity
@IdClass(ParentId.class)
public class Parent {

	@Id
	@Column(name = PARENT_ID1)
	private String id1; //ParentId.id1 과 연결
	@Column(name = PARENT_ID2)
	private String id2; //ParentId.id2 과 연결
    
}

public class ParentId implements Serializable {
	private String id1; //Parent.id1 매핑
	private Stringid2; //Parent.id2 매핑
	
    public ParentId() {

    }

    public ParentId(String id1, String id2) {
        this.id1 = id1;
        this.id2 = id2;
    }

    @Override
    public Boolean equals(Object o) {}
    @Override
    public int hashCode () {}
}

@IdClass 사용 조건

  • 식별자 클래스의 속성명과 엔티티에서 사용하는 식별자의 속성명이 같아야 한다.
  • Serializable 인터페이스를 구현해야 한다.
  • Equals, hashCode를 구현해야 한다.
  • 기본 생성자가 있어야 한다.
  • 식별자 클래스는 public 이어야 한다.


2.@EmbeddedId

@Entity
public class Parent {
    @EmbeddedId
    private ParentId id;
    private String name;
    
}

@Embeddable
public class ParentId implements Serializable {
		@Column(name = PARENT_ID1)
		private String id1;
		@Column(name = PARENT_ID2)
		private String id2;
		 //@IdClass와 다르게 @EmbeddedId를 적용한 식별자 클래스는 식별자 클래스에 기본 키를 직접 매핑 그 외에는 동일(equals, hashCode 등…)
}


3.일대일 식별 관계

자식 테이블의 기본 키 값으로 부모 테이블의 기본 키 값만 사용

@Entity
public class Board {
    @Id @GeneratedValue
    @Column(name = BOARD_ID)
    private Long id;
    private String title;
    @OneToOne(mappedBy = board)
    private BoardDetail boardDetail;
    
}

//자식
@Entity
public class BoardDetail {
    @Id
    private Long boardId;
    
    @MapsId //BoardDetail.boardId 매핑
    @OneToOne
    @JoinColumn(name=BOARD_ID)
    private Board board;
    
    private String content;
    
}


조인 테이블

  • 조인 컬럼 사용 (외래 키)
  • 조인 테이블 사용 (테이블 사용)


1.일대일 조인 테이블

//부모
@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;
    
}

@JoinTable 속성

  • Name: 매핑할 조인 테이블 이름
  • joinColumns: 현재 엔티티를 참조하는 외래 키
  • inverseJoinColumns: 반대방향 엔티티를 참조하는 외래 키


양방향 매핑 추가 코드

@OneToOne(mappedBy = child)
private Parent parent;p


2.일대다 조인 테이블

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


3.다대일

@Entity
public class Child {
    
    @ManyToOne(optional = false)
    @JoinTable(name = PARENT_CHILD, joinColumns = @JoinColumn(name = CHILD_ID), inverseJoinColumns = @JoinColumn(name = PARENT_ID))
    private Parent parent;
}


4.다대다 조인 테이블

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


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

@Entity
@Table(name=BOARD)
@SecondaryTable(name=BOARD_DETAIL, pkJoinColumns = @PrimaryKeyJoinColumn(name =BOARD_DETAIL_ID))
public class Board {
    
    @Column(table = BOARD_DETAIL) //BOARD_DETAIL 테이블에 매핑
    private String content;
    
}

@SecondaryTable.name : 매핑할 다른 테이블의 이름

@SecondaryTable.pkJoinColumns: 매핑할 다른 테이블의 기본 키 컬럼 속성


출처 : 자바 ORM 표준 JPA 프로그래밍 김영한 지음