[JPA] 단방향, 양방향, 연관관계 주인
단방향, 양방향
- 테이블은 외래키 하나로 양방향 쿼리가 가능해서 방향이라는 개념이 없습니다.
- 객체는 참조용 필드를 가지고 있는 객체만 연관된 객체를 조회할 수 있습니다.
- 단방향 : 객체 관계에서 한쪽만 참조하는 것을 말합니다.
- 양방향 : 객체 관계에서 양쪽이 서로 참조하는 것을 말합니다.
연관관계 주인
데이터베이스는 외래키 하나로 두 개의 테이블을 연관관계를 맺습니다.
데이터베이스는 연관관계를 관리하는 지점은 외래키 하나인 반면에 엔티티를 양방향으로 매핑하면 두 개의 객체는 서로 참조를 해서 객체의 연관관계를 관리하는 지점은 2개가 됩니다.
연관관계 주인은 두 객체의 연관관계 중 하나를 정해서 데이터베이스의 외래키를 관리하는 것입니다.
연관관계 주인은 @JoinColumn(name = "참조하는 테이블 기본키")
연관관계 주인이 아닌 것은 mappedBy = "연관관계 주인에서 정의한 변수"를 써주면 되고 단방향일 경우는 연관관계 주인에 @JoinColumn만 해주고 mappedBy를 안 해줘도 됩니다. 만약 양방향일 경우 연관관계 주인 아닌 곳에도 mappedBy를 해주시면 됩니다.
* 참고
@ManyToOne은 무조건 연관관계주인이기도 해서 mappedBy 속성이 없습니다.
연관관계 주인을 정하는 방법
- 1 : N or N : 1 일 경우 : N이 연관관계 주인
- 1 : 1 일 경우 : 주테이블이 연관관계 주인
- M : N 일경우 : M과 N을 연결해주는 테이블 추가하여 1 : M과 N : 1을 만들어서 M과 N이 연관관계 주인
예시(팀 엔티티와 회원 엔티티)
Team엔티티 -> Member엔티티 : N
Member엔티티 -> Team엔티티 : 1
연관관계 주인 : Member엔티티
단방향일 경우
@Entity
@Getter @Setter
public class Team {
@Id
@GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
}
@Entity
@Getter @Setter
public class Member {
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
public Team team;
}
양방향일 경우
@Entity
@Getter @Setter
public class Team {
@Id
@GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
@Entity
@Getter @Setter
public class Member {
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
public Team team;
}
- 연관관계 주인이 아닌 Team엔티티에서 @OneToMany는 1 : N관계여서 엔티티를 하나 이상 참조할 수 있으므로 Collection, List, Set, Map 중 하나를 사용해야 합니다.
'JPA' 카테고리의 다른 글
[JPA] N+1 원인 및 해결방법 (0) | 2023.01.18 |
---|---|
[Querydsl] 스프링 부트에서 Querydsl 설정 (0) | 2022.06.14 |
[JPA] 프록시, 즉시 로딩, 지연 로딩 (0) | 2022.01.30 |
[JPA] 엔티티 매핑 (0) | 2022.01.25 |
[JPA]영속성 컨텍스트란? (0) | 2022.01.19 |
댓글
이 글 공유하기
다른 글
-
[Querydsl] 스프링 부트에서 Querydsl 설정
[Querydsl] 스프링 부트에서 Querydsl 설정
2022.06.14 -
[JPA] 프록시, 즉시 로딩, 지연 로딩
[JPA] 프록시, 즉시 로딩, 지연 로딩
2022.01.30 -
[JPA] 엔티티 매핑
[JPA] 엔티티 매핑
2022.01.25 -
[JPA]영속성 컨텍스트란?
[JPA]영속성 컨텍스트란?
2022.01.19