티스토리 뷰
jpa 많이 쓰는데... 쓸때마다 헷갈려서 이참에 제대로 확인하고 정리해보기로 했다.
관계 매핑으로 1:1, 1:N, N:1, N:M 있지만 본 글에서는 1:1에 대하여 정리한다.
※ 공부하여 정리하는 글로 잘못된 부분이 있을 수 있습니다. 잘못된 부분이 있다면 알려주시면 감사하겠습니다 :)
1 : 1 관계란?
1:1 관계란 서로 다른 두 엔티티가 각 입장에서 하나의 관계만 갖는다는 것이다.
Ex ) 학생과 사물함은 1:1 관계를 가진다. 학생은 하나의 사물함을 가지며, 사물함은 한명의 학생에게만 사용된다.
- 학생 한 명당, 사물함 1개만 제공한다는 가정하에... ㅎㅎ
Spring Data JPA 를 이용한 1:1 관계
Foreign Key 를 이용한 방법 - 양방향
1) 1:1 관계인 두 entity 사이에 주 entity를 지정한다. ( 초점을 두고 사용될 Entity )
2) 주 entity 에 Foreign Key를 삽입한다.
- @OneToOne
- @JoinColumn ( name = "테이블에 생성될 컬럼 명", referencedColumnName = "외부에서 가져오는 컬럼 명" )
3) 주 entity가 아닌 entity(non-owning side)에서 자신의 Key를 소유하고 있는 entity를 알린다. (JPA에서 1:1은 양방향을 제공함)
- @OneToOne ( mappedBy = "주 entity 에 포함되어 있는 자신의 필드명" )
※ table "student"와 "locker"의 1:1관계 양방향으로, 주 entity는 "student" 이다.
- insert 방법
Primary Key 를 공유하는 방법
이 방법은 table 내에 foreign key를 primary key로 설정하는 것이다. table "student", "locker"에 대입해보면, "locker"의 primary key를 "student"의 primary key로 대신하는 것이다.
※ 관점이 "student" entity에서 "locker" entity로 변한다.
1) 두 entity에서 id 에 foreign key를 대입할 entity를 정한다. ( 여기서는 "locker" entity의 id가 student_id로 설정된다. )
2) foreign key를 id로 사용하기 위해 필요한 설정을 진행한다.
- @JoinColumn, @MapsId 를 이용하여 foreign key로 가져올 entity를 지정한다.
- @Id 필드에 foreign key를 매핑한다.
- @OneToOne 으로 1:1 매핑임을 알린다.
3) 자신의 Primary key가 다른 entity의 Id로 설정됨을 알린다.
- @PrimaryKeyJoinColumn
- @OneToOne(mappedBy = "소속되는 entity의 필드 명")
※ Locker에서 @GeneratedValue가 필요없는 이유는 Locker의 ID를 Student의 ID로 대신하기 때문이다.
- insert 방법
※ JPA 에서는 1:1 양방향을 지원한다.
※ @OneToOne 에서 mappedBy 속성은 주 Entity에 소속되는 Entity에서 작성되는 것이다.
[참고자료]
https://www.baeldung.com/jpa-one-to-one
'Spring' 카테고리의 다른 글
[ 개념 ] DI ( Dependency Injection ) - 1 (0) | 2022.02.14 |
---|---|
[ validation ] BindException? MethodArgumentNotValidException? (+ @RequestBody) (0) | 2022.01.04 |
[ junit5 ] 단위테스트 - controller (0) | 2021.12.30 |
[Spring Rest Docs ] Spring Rest Docs 적용하기 (2) | 2021.11.23 |
[JPA] N:1 관계 (0) | 2021.11.22 |