TIL

JPA

@MapsId

  • @MapsId는 JPA에서 외래 키(FK)를 기본 키(PK)로 공유할 때 사용합니다.
  • 쉽게 말해, 연관된 엔티티의 PK를 이 엔티티의 PK로 “덮어쓰도록 매핑”하는 역할을 합니다.

예제

  • Answer의 id 필드는 실제 DB에서는 question_id 컬럼과 매핑됩니다.
  • @MapsId는 question.getId() 값을 자동으로 id 필드에 설정합니다.
//Question.java

   @OneToOne(mappedBy = "question", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Answer answer;
    
    
// Answer.java

      @Id
    @Column(name = "question_id")
    private Long id;

    @OneToOne(fetch = FetchType.LAZY)
    @MapsId  // 핵심! 이걸 통해 question_id를 PK로도 사용
    @JoinColumn(name = "question_id")
    private Question question;
}

@EmbeddedId

  • 복합 키(Composite Primary Key)를 엔티티에서 정의할 때 사용하는 어노테이션
  • @Id 하나만으로는 기본 키를 표현하기 어려울 때(예: 주문-상품 테이블의 order_id + product_id), 이 복합 키를 별도의 클래스(@Embeddable)로 만들고, 엔티티 안에서 이 클래스를 식별자로 매핑하는 데 사용됩니다.

예제

import global.common.entity.BaseEntity;
import jakarta.persistence.Column;
import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
 * 지역별 편의시설 집계를 담는 엔티티입니다.
 */
@Entity
@Getter
@Table(name = "region_facility_count")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class RegionFacilityCount extends BaseEntity {

    /**
     * 복합키 (시군구 코드, 편의시설 코드)
     */
    @EmbeddedId
    private RegionFacilityCountId id;

    /**
     * 편의시설 개수
     */
    @Column(name = "facility_count", nullable = false)
    private Integer facilityCount;
}
import java.io.Serializable;
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
 * RegionFacilityCount 엔티티의 복합키 클래스입니다.
 */
@Embeddable
@Getter
@EqualsAndHashCode
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class RegionFacilityCountId implements Serializable {

    /**
     * 시군구 코드
     * CHAR(5)
     */
    @Column(name = "sigungu_code", columnDefinition = "CHAR(5)")
    private String sigunguCode;

    /**
     * 편의시설 코드
     * INTEGER
     */
    @Column(name = "facility_code")
    private Integer facilityCode;
}

results matching ""

    No results matching ""