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;
}