외래키의 주인 정하기
- 외래키의 주인 ➡️ 등록, 수정, 삭제 가능 (관리)
외래키 주인 X ➡️ 읽기만 가능. - @JoinColumn() : 외래키의 주인이 활용하는 annotation으로, 컬럼명, null 여부, unique 여부 등을 지정
1) 1 대 1 관계
@OneToOne : Entity 간의 1대1 관계일 때 맺어주는 역할 수행
1-1. 단방향 관계
- 단방향 관계는 상대 entity 따로 필드가 없어 조회 불가능
1-2. 양방향 관계
- 양방향 관계는 서로가 상대 entity를 가지고 있음.
- mappedBy : 외래키의 주인을 지정해줄 때 사용하는 옵션.
- 외래키의 주인이 아닌 쪽에서 주인 지정
- mappedBy의 속성값은 상대 entity(외래키의 주인)에 있는 외래키 필드명을 의미
2) N 대 1 관계
- 외래키의 주인(N의 관계)은 @JoinColumn
1-1. 단방향 관계
- 단방향 관계는 상대 entity 따로 필드가 없어 조회 불가능
1-2. 양방향 관계
외래키 주인
- @ManyToOne : Entity 간의 N대1 관계일 때 맺어주는 역할 수행
- @JoinColumn
외래키의 주인 X
- @OneToMany : Entity 간의 1대N 관계일 때 맺어주는 역할 수행
- mappedBy 옵션 사용
- 1쪽에서 N쪽을 참조하려다 보니 List의 형태로 관리
3) 1 대 N 관계
1-1. 단방향 관계
- 외래키를 관리하는 주인이 아닌쪽에서 외래키를 가짐.
- N관계의 테이블이 외래키를 가질 수 있지만, 주인은 현재 1의 관계의 쪽이므로 외래키는 주인이 아닌 쪽에서 가지고, 외래키의 주인은 상대 entity를 리스트형태로 가지고 관리.
- @JoinColumn(), @OneToMany
insert 한 번으로 해결할 수 있는 것을 1대N 단방향 관계에서는 update가 추가적으로 발생된다는 한계점이 존재.@Entity @Table(name = "food") public class Food { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private double price; @OneToMany @JoinColumn(name = "food_id") // users 테이블에 food_id 컬럼 private List<User> userList = new ArrayList<>(); }
1-2. 양방향 관계
- 1:N 관계에서는 양방향관계 존재 X
- @ManyToOne annotation에서는 mappedBy 속성 제공 X
(1:N 관계 양방향을 JPA자체가 지원하지 않음.)
3) N 대 M 관계
- N:M관계를 풀어내기 위해 중간 테이블을 생성하여 사용
- 중간테이블에서는 다른 두 테이블의 id를 가짐.
- 생성되는 중간 테이블을 컨트롤하기 어렵기 때문에 추후에 중간 테이블 변경이 발생할 경우, 문제 발생 가능성 존재.
1-1. 단방향 관계
외래키의 주인
- @JoinTable을 이용해 중간 테이블 생성
- @JoinColumn을 이용해 반대, 중간 테이블로 조인한 컬럼을 각각 설정
- @ManyToMany
- 외래키 주인X Entity 리스트로 참조
1-2. 양방향 관계
외래키의 주인
- @JoinTable을 이용해 중간 테이블 생성
- @JoinColumn을 이용해 반대, 중간 테이블로 조인한 컬럼을 각각 설정
- @ManyToMany
- 외래키 주인X Entity 리스트로 참조
외래키의 주인 X
- @ManyToMany(mappedBy = "")
- 외래키 주인 Entity 리스트로 참조
'내일배움캠프(Sparta) > Spring' 카테고리의 다른 글
[Spring] Entity 연관관계 (1) | 2023.11.14 |
---|---|
[Spring] RestTemplate (0) | 2023.11.10 |
[Spring] Spring Security / Validation (1) | 2023.11.09 |
[Spring] Filter (0) | 2023.11.09 |
[Spring] JWT / 패스워드 암호화 (0) | 2023.11.08 |