twocowsong

주 테이블 외래 키 본문

IT/JPA

주 테이블 외래 키

WsCode 2022. 6. 19. 13:14

1 : 1 관계를 구성할 때 객체지향 개발자들은 주 테이블에 외래 키가 있는것을 선호합니다.

JPA도 주 테이블에 외래 키가 있으면 좀더 편리하게 매핑할 수 있습니다.

 

단방향

회원과 사물함의 1 : 1 단방향 관계를 알아보겠습니다.

MEMBER가 주 테이블이고 LOCKER는 대상 테이블입니다.

@Entity
@Table(name = "MEMBER")
public class Member {

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

   private String username;

   @OneToOne
   @JoinColumn(name = "LOCKER_ID")
   private Locker locker;

   // Getter, Setter...
}
@Entity
@Table(name = "LOCKER")
public class Locker {
   @Id
   @GeneratedValue
   @Column(name = "LOCKER_ID")
   private Long id;

   private String name;
}

1 : 1 관계이므로 객체 매핑에 @OneToOne을 사용하였습니다.

DB에는 LOCKER_ID 외래키에 유니크 제약조건을 추가했습니다.

참고로 이 관계는 N : 1 단방향과 거의 비슷합니다.

 

다음으로 반대 방향을 추가해서 1 : 1 양방향 관계로 만들어보겠습니다.

@Entity
@Table(name = "LOCKER")
public class Locker {
   @Id
   @GeneratedValue
   @Column(name = "LOCKER_ID")
   private Long id;

   private String name;
   
   @OneToOne(mappedBy = "locker")
   private Member member;
   
}

LOCKER 테이블에 member 필드를 추가하였습니다.

양방향이므로 연관관계의 주인을 정해야합니다.

MEMBER테이블이 외래 키(Member.Locker_id)를 가지고 있으므로 Member.locker이 연관관계의 주인입니다.

따라서 반대 매핑인 사물함의 Locker.member은 mappedBy를 선언해서 연관관계의 주인이 아니라고 설정했습니다.

 

'IT > JPA' 카테고리의 다른 글

다 대 다 [N : N]  (0) 2022.06.20
대상 테이블에 외래 키  (0) 2022.06.19
일 대 일 [ 1 : 1 ]  (0) 2022.06.18
일 대 다 양방향  (0) 2022.06.14
일 대 다  (0) 2022.06.13