일대일 단방향
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을 연관관계의 주인으로 설정하고, 매핑하면 끝이다.