새소식

xub2의 개발 새발 🐾
💽 Database/JPA

[JPA] 연관관계 매핑 - 6 : 일대일 연관관계 [1:1]

2025. 9. 16. 11:21

  • -

일대일 단방향

member을 주테이블이라고 가정

일대일 관계는 반대를 기준으로 잡아도 1:1 관계이다. -> 그래서 주테이블이나 반대 테이블 아무곳이나 외래키를 둬도 된다.

또한 일대일 관계는 왜래키 컬럼에 UNIQUE 제약 조건이 붙어야한다.

위 예시에선 한 회원이 하나의 락커만 가질 수 있다고 가정하자. 그리고 반대로 하나의 락커도 한명이 사용한다고 가정하자.

엔티티와 테이블 매핑을 보면, 그냥 다대일 관계와 거의 비슷하다. 즉 엔티티가 매핑된 자신의 테이블의 FK를 수정할 수 있다. (그리고 반대로 락커에 멤버를 넣어도 됨)


일대일 양방향

기존에 N:1 등은 n을 관리하기 위해 컬렉션이 필요했는데, 1:1 관계에선 서로 각자 객체의 참조 하나씩만 가지고 있으면 빠르게 그래프 탐색이 가능해진다.

@Entity
@Getter @Setter
public class Member {

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

    private String username;

    @ManyToOne
    @JoinColumn(name = "team_id")
    private Team team;

    @OneToOne
    @JoinColumn(name = "locker_id")
    private Locker locker; // 추가

    }

}
@Entity
public class Locker {

    @Id @GeneratedValue
    private Long id;

    private String name;

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

주 테이블에 FK를 넣어줬고, 반대편은 수정할 수 없도록 mappedBy로 막았다. 마치 그냥 다대일 관계 같다.


대상 테이블에 외래키가 있는 단방향 연관관계

연관관계의 주인이 Member인데, 만약 반대편 테이블에 FK가 존재한다면 어떨까? 마치 1:N 단방향 같다.

근데 이건 지원도 안되고 편법도 없다 걍 쓰지 말자.

 

대상 테이블에 외래키가 있는 양방향 연관관계

근데 또 양방향은 된다.

엔티티를 양방향으로 일단 먼저 만든다. 그리고 대상 테이블에 FK가 존재한다.

근데 이건 연관관계 모식도를 보면, 그냥 Locker의 member을 연관관계의 주인으로 설정하고, 매핑하면 끝이다.

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.