미운 오리 새끼의 우아한 개발자되기

[JPA] 다양한 연관관계 매핑 (3) 일대일 본문

Spring & Spring Boot/Spring

[JPA] 다양한 연관관계 매핑 (3) 일대일

Serina_Heo 2023. 4. 11. 21:52

일대일 관계는 양쪽이 서로 하나의 관계를 가진다. 

예를 들어 회원은 하나의 사물함을 가지고, 사물함은 하나의 회원에 의해 사용된다.

고로, 일대다와 다대일에서 항상 다(N) 쪽이 FK 를 가졌으나, 일대일 관계에서는 FK 가 어디에 있든 상관없다.

주(main) 테이블이든 대상 테이블이든 FK 하나만 있으면 양쪽을 조회할 수 있다.

 

1.1. 주 테이블에 외래키

아래는 일대일 단방향, 주 테이블에 외래키가 있는 예제 코드이다.

@Entity
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
public class Locker {
	
    @Id @GeneratedValue
    @Column(name = "LOCKER_ID")
    private Long id;
    
    private String name;
	
    // Getter, Setter...
}

 

아래 예제 코드는 일대일 주 테이블에 외래 키, 양방향이다.

양방향이므로 연관관계 주인을 정해야 한다. FK를 가지고 있는 쪽이 주인이 된다.

@Entity
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
public class Locker {
	
    @Id @GeneratedValue
    @Column(name = "LOCKER_ID")
    private Long id;
    
    private String name;
	
    @OneToOne(mappedBy = "locker")
    private Member member;
    
    // Getter, Setter...
}

 

1.2. 대상 테이블에 외래 키

단방향

일대일 관계 중 대상 테이블에 외래키가 있는 단방향 관계는 JPA 에서 지원 x

 

양방향

일대일 매핑에서 대상 테이블에 외래 키를 두고 싶으면 이렇게 양방향으로 매핑한다.

@Entity
public class Member {

    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    
    private String username;
    
    @OneToOne(mappedBy = "member")
    private Locker locker;
    
    // Getter, Setter...
}

@Entity
public class Locker {
	
    @Id @GeneratedValue
    @Column(name = "LOCKER_ID")
    private Long id;
    
    private String name;
	
    @OneToOne
    @JoinColumn(name = "MEMBER_ID")
    private Member member;
    
    // Getter, Setter...
}

 

Reference : 자바 ORM 표준 JPA 프로그래밍 (김영한 저)