jpa 복합키 매핑하는 법


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")