본 내용은 유튜브 최범균님의 강의 내용을 정리한 내용입니다.
JPA 기초 14 엔티티 간 1-1 단방향 연관 매핑
주의사항!!
연관 매핑은 진짜 필요한 경우에 만 사용해야 합니다.
- 연관된 객체 탐색이 쉽다는 이유로 사용하지 않습니다.
- 조회 기능은 별도 모델을 만들어 구현합니다. (CQRS)
1. 참조키 방식 1 - 1 단방향 연관 매핑
- @OneToOne 어노테이션은 두 엔터티 사이의 일대일 관계를 매핑하는 데 사용됩니다.
- @OneToOne 어노테이션은 기본적으로 FetchType.Eager 입니다.
- @JoinColumn 어노테이션은 외래 키(Foreign Key)를 지정할 때 사용됩니다.
package com.example.jpa.entity;
...
@Data
@NoArgsConstructor
@Entity
public class MembershipCard {
@Id
@Column(name = "card_no")
private String number;
@OneToOne // 1대1 연관 관계 지정
@JoinColumn(name = "user_email") // 조인 시 참조할 컬럼 지정
private User owner;
@Column(name = "expiry_date")
private LocalDateTime expiryDate;
private Boolean enabled;
...
}
- @OneToOne 어노테이션은 owner 필드가 1:1 연관 관계를 가짐을 명시합니다.
- @JoinColumn(name = "user_email") 어노테이션은 조인할 때 사용할 FK(Foreign Key) 컬럼의 이름을 지정합니다.
엔티티 조회
MembershipCard foundCard = entityManager.find(MembershipCard.class, "8888111122223333");
System.out.println(foundCard.getOwner());
2. 식별자 공유 방식 1 - 1 단방향 연관 매핑
- @PrimaryKeyJoinColumn 어노테이션은 기본 키를 사용하여 두 엔터티 간의 일대일 관계를 매핑할 때 외래 키를 기본 키에 매핑하는 데 사용됩니다.
package com.example.jpa.entity;
...
@Data
@NoArgsConstructor
@Entity
@Table(name = "best_pick")
public class BestPick {
@Id
@Column(name = "user_email")
private String email;
@OneToOne
@PrimaryKeyJoinColumn(name = "user_email") // 조인 시 사용할 best_pick 테이블의 PK 컬럼 명시
private User user;
private String title;
public BestPick(User user, String title) {
this.email = user.getEmail();
this.user = user;
this.title = title;
}
}
- User 엔티티와 BestPick 엔티티는 같은 ID를 사용하고 있습니다.
- 그래서 @PrimaryKeyJoinColumn 어노테이션을 사용하여 Join시 참조할 PK 컬럼을 지정해줍니다.
'JPA' 카테고리의 다른 글
Spring JPA - 회원 엔티티, 서비스, 레포지토리 구현 (1) | 2024.01.23 |
---|---|
JPA 기초 - 엔티티 1 - N 단방향 연관관계 (0) | 2024.01.22 |
JPA 기초 - 값 컬렉션 Map 매핑 (0) | 2024.01.18 |
JPA 기초 - 값 컬렉션 List 매핑 (0) | 2024.01.18 |
JPA 기초 - 값 컬렉션 Set 매핑 (0) | 2024.01.18 |