반응형
@EmbededId | @IdClass | |
---|---|---|
장점 | - 객체지향적이다. (예제의 shopNumber 컬럼체크) - @MapsId 를 이용한 객체생성 편리 |
- 비즈니스적으로 의미있는 PK 값이라면 명시적으로 필드를 노출할 수 있다. - 식별관계 매핑을 여러 테이블에서 사용할때, 객체 연관관계를 단순하게 유지 가능 |
단점 | - 복합키구조가 2개이상 테이블에 식별관계로 매핑이 될때 복잡도가 증가한다. | - 컬럼에 대한 필드선언이 중복이 발생한다. - @MapsId 활용이 불가능하여 객체 생성할때 주의를 요함 |
단순한 하나의 복합키만 존재한다고 하면 @EmbededId
복합키를 통한 식별관계 매핑이 여기저기 존재한다면 @IdClass
이는 중복을 조금더 허용하더라도 Legacy Table 의 설계 의도를 Entity 에 녹여서 명시적인 객체구조를 가질 수 있어 기존의 운영중이 테이블과 이질감이 줄어들게된다.
@EmbededId
@EmbededId를 사용한 객체를 연관관계로 가지며, 그 객체가 @Embeddable을 가지고 Serializable을 상속받음
@Data
@Embeddable
class EmpId implements Serializable {
@Column(name = "EMP_NO")
private int empNo;
@Column(name = "EMP_NAME")
private String empName;
}
@Entity
class Emp {
@EmbeddedId
private EmpId empId;
private String phone;
}
@IdClass
@IdClass(상속테이블명.class)를 가지면, 해당 상속테이블의 컬럼명과 같은 컬럼들을 @Id컬럼으로 사용하는 구조
@Data
class OrderProductPK implements Serializable {
private int orderId;
private int productId;
}
@Entity
@IdClass(OrderProductPK.class)
class OrderProduct {
@Id
@Column(name = "ORDER_ID")
private int orderId;
@Id
@Column(name = "PRODUCT_ID")
private int productId;
private int amount;
}
- 등록된 PK.class를 다른 Entity,Repository에 적용할 수 있다.(재사용)
728x90
반응형
'스프링 > JPA' 카테고리의 다른 글
JPA 변경/삭제 @Modifying (0) | 2021.06.04 |
---|---|
FK가 PK가 아닌 다른 컬럼과 연관관계가 있을 때 (0) | 2021.05.31 |
전체 컬럼 매핑은 필수? DB default값 (0) | 2021.05.26 |
JPA 상속 관계 (TABLE_PER_CLASS전략) (0) | 2021.05.21 |
JPA 활용 1 (0) | 2021.04.23 |
댓글