
책 [자바 ORM 표준 JPA 프로그래밍]을 참고하여 작성하였습니다.
테이블로 구현할 때는 3가지 전략을 사용할 수 있다.

@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;
private String actor;
}

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@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;
private String actor;
}

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item{
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
}
@Entity
public class Album extends Item {
private String artist;
}
@Entity
public class Movie extends Item {
private String director;
private String actor;
}
@MapepdSuperClass
public abstract class BaseEntity {
@Id @GeneratedValue
private Long id;
private String name;
}
@Entity
public class Member extends BaseEntity{
private String email;
}
@Entity
public class Seller extends BaseEntity {
private String shopName;
}
기본키 & 외래키로 사용기본키로만 사용하는 관계최근에는 비식별 관계를 주로 사용하고 필요한 곳에만 식별 관계를 채택하는 추세.
equals와 hashCode 사용하여 동등성 비교@IdClass와 @EmbeddedId 제공[예시]
다음과 같은 테이블을 가정해보자.

▼부모 클래스
@Entity
@IdClass(ParentId.class)
public class Parent {
@Id
@Column(name = "PARENT_ID1")
private String id1;
@Id
@Column(name = "PARENT_ID2")
private String id2;
private String name;
}
▼식별자 클래스
public class ParentId implements Serializable {
private String id1;
private String id2;
public ParentId() {
}
public ParentId(String id1, String id2) {
this.id1 = id1;
this.id2 = id2;
}
@Override
public boolean equals(Object obj) {
...
}
@Override
public int hashCode() {
...
}
}
다음과 같이 조회할 수 있다.
ParentId parentId = new ParentId("myId1", "myId2");
Parent parent = em.find(Parent.class, parentId)
▼자식 클래스
@Entity
public class Child{
@Id
private String id;
@ManyToOne
@JoinColumns({
@JoinColumn(name="PARENT_ID1",
referencedColumnName = "PARENT_ID1"),
@JoinColumn(name = "PARENT_ID2",
referencedColumnName = "PARENT_ID2")
})
private Parent parent;
}
db 테이블의 연관관계를 설명하는 방법
1. 외래키를 이용한 조인 컬럼
2. 조인 테이블 : 주로 다대다 관계를 일대다, 다대일 관계로 풀어내기 위해 사용 (a.k.a 연결테이블, 링크테이블)