Spring JPA

[Spring JPA] 일대일 관계

hoondev3 2023. 1. 28. 14:32

일대일 관계

일대일 관계는 주 테이블과 대상테이블중에 외래키를 어디 넣을지 선택이 가능하다. 

일대일 관계로 Member와 Locker를 들 수 있다. 둘다 서로를 1개씩만 가지고 있기 때문에 일대일 관계로 매핑할 수 있다.

 

주 테이블에 외래키

@Entity
public class Member { 
 
 @Id @GeneratedValue
 private Long id;
 
 @Column(name = "USERNAME")
 private String name;
 
 @OneToOne
 @JoinColumn(name = "LOCKER_ID")
 private Locker locker;

 … 
}
@Entity
public class Locker {

  @Id @GeneratedValue
  private Long id;
  
  @OneToOne(mappedBy = "locker")
  private Member member
  
 
  ...	
}

다대일, 일대다와 마찬가지로 mappedBy로 양방향 관계를 이룰 수 있다. 이 member는 읽기 전용 필드이다.

 

여기서도 마찬가지로 외래키가 있는 쪽이 연관관계의 주인이다.

 

이 방법의 장점은 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인이 가능하다.

단점은 값이 없으면 외래키에 null을 허용해야 한다.

 

대상 테이블에 외래키

대상 테이블에 외래키가 있는 경우의 단방향은 지원하지 않는다.

 

@Entity
public class Member { 
 
 @Id @GeneratedValue
 private Long id;
 
 @Column(name = "USERNAME")
 private String name;
 
 @OneToOne(mappedBy = "member")
 private Locker locker;

 … 
}
@Entity
public class Locker {

  @Id @GeneratedValue
  private Long id;
  
  @OneToOne
  @JoinColumn(name = "MEMBER_ID")
  private Member member
  
  ...	
}

양방향은 위에 있는 주 테이블에 외래키가 있을때의 양방향을 반대로 뒤집은 상태로 가능하다.

여기서는 연관관계의 주인이 member가 되고 Locker의 locker는 읽기 전용 필드로 설정된다.

 

이방법의 장점은 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조를 유지할 수 있다.

단점은 기본 프록시의 기능 한계로 지연로딩으로 설정해도 항상 즉시로딩으로 동작한다는 단점이다.

 

Reference

https://www.inflearn.com/course/ORM-JPA-Basic