[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들어가기 전 스프링 부트 2.6 이상 버전에서는 2.6 이하 버전에서 설정한 부분에 조금 추가를 하셔야 정상적으로 동작합니다. 필자는 스프링 부트 버전 2.7 Gradle 버전 7.4.1을 기준으로 설정을 하였습니다. 스프링 부트 2.6 이하 버전 먼저 스프링 부트 2.6이하 버전에서 querydsl 설정을 알아보겠습니다. build.gradle plugins { // querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } dependencies { implementation 'com.querydsl:querydsl-jpa' } //querydsl 추가 def querydslDir = "$buildDir/generated/queryds… -
[JPA] 프록시, 즉시 로딩, 지연 로딩
[JPA] 프록시, 즉시 로딩, 지연 로딩
2022.01.30프록시 연관된 객체를 자유롭게 탐색하기 위해 사용하는 기술입니다. 엔티티를 조회할 때 연관된 엔티티들이 항상 같이 조회되는 것은 아닙니다. 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 지연 로딩이라고 하는데 지연 로딩 기능을 사용하려면 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 그것을 프록시 객체라고 합니다. 프록시를 사용하면 연관된 객체를 처음부터 데이터베이스에서 조회하는 것이 아니라 실제 사용하는 시점에서 데이터 베이스를 조회할 수 있습니다. ※ 공통 예제 코드 ※ @Entity @Getter @Setter public class Member { @Id @GeneratedValue private Long id; private String na… -
[JPA] 엔티티 매핑
[JPA] 엔티티 매핑
2022.01.25 -
[JPA]영속성 컨텍스트란?
[JPA]영속성 컨텍스트란?
2022.01.19
댓글을 사용할 수 없습니다.