JPA는 영속성 컨텍스트에 엔티티를 보관 시,
식별자를 사용하고 이를 구분하기 위해 equals와 hashcode를 사용해 비교한다.
이때 식별자가 2개 이상이면 별도의 식별자 클래스를 만들고 그곳에 equals와 hashcode를 구현해야한다.
JPA는 2가지 방법을 제공하고 있다.
1.1 @IdClass
1.2 @EmbeddedId
이번에 @EmbeddedId로 구현했다. -> 해당 방법이 좀 더 객체지향적이라고 생각!
필수 조건
@Embeddable 어노테이션 필수
Sericalizable 인터페이스를 구현
equals, hashcode를 구현 -> @EqualsAndHashCode 어노테이션 활용
기본 생성자가 있어야 한다
식별자 클래스는 public
ex)
@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "SCH_SCRAP_ERR_HIST")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class SchScrapErrHist {
@EmbeddedId
private SchScrapErrHistId id;
...
}
@Embeddable
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@EqualsAndHashCode
public class SchScrapErrHistId implements Serializable {
@Column(name = "BIZ_UNIT_SEQ", length = 20, nullable = false)
private String bizUnitSeq;
@Column(name = "ORG_CD", length = 20, nullable = false)
@Enumerated(EnumType.STRING)
private OrgCd orgCd;
@Column(name = "SVC_CD", length = 20, nullable = false)
@Enumerated(EnumType.STRING)
private SvcCd svcCd;
@Builder
public SchScrapErrHistId(String bizUnitSeq, OrgCd orgCd, SvcCd svcCd) {
this.bizUnitSeq = bizUnitSeq;
this.orgCd = orgCd;
this.svcCd = svcCd;
}
}
식별 관계 매핑
식별관계에서 자식 테이블은 부모 테이블의 기본 키를 포함해서 복합 키를 구성해야 하므로,
@IdClass나 @EmbeddedId를 사용해서 매핑
@EmbeddedId가 사용될 때 '@MapsId'를 사용해야 한다.
@MapsId("parentId")
@ManyToOne
@JoinColumn(name = "PARENT_ID")