연관관계 관련 심화
단방향 연관관계
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
@Entity
@Getter
@Setter
public class Member {
@Id
@Column(name = "member_id")
private String id;
private String username;
@ManyToOne
@JoinColumn(name="team_id")
private Team team;
public void setTeam(Team team) {
this.team = team;
}
}
@Entity
@Getter
@Setter
public class Team {
@Id
@Column (name = "TEAM_ID")
private String id;
private String name;
}
|
cs |
@ManyToOne : 이름 그대로 다대일(N:1) 관계라는 매핑 정보였습니다. “한명의 유저가 여러개의 주문” 기억나시죠? 주요 속성으로는 optional, fetch, cascade가 있습니다. optional은 말 그대로 false로 설정하면 항상 연관된 엔티티가 있어야 생성할 수 있다는 뜻 입니다. fetch와 cascade는 뒤에 조금 더 설명하겠습니다
@JoinColumn(name="food_id") : 외래 키를 매핑할 때 사용했습니다. (실제 데이터베이스에는 객체필드에는 해당 객체 테이블의 외래키가 들어간다고 말씀드렸었죠?) 기본적으로 @Column이 가지고 있는 필드 매핑관련 옵션 설정들과, 외래키 관련 몇가지 옵션이 추가되어있는 옵션입니다.
양방향 연관관계
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@Getter
@Entity
@NoArgsConstructor
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String memberName;
@OneToMany(mappedBy = "member", fetch = FetchType.EAGER)
private List<Orders> orders = new ArrayList<>();
public Member(String memberName) {
this.memberName = memberName;
}
}
|
cs |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@Getter
@Entity
@NoArgsConstructor
public class Orders {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "food_id")
private Food food;
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
public Orders(Food food, Member member) {
this.food = food;
this.member = member;
}
}
|
cs |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
@Getter
@Entity
@NoArgsConstructor
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String foodName;
@Column(nullable = false)
private int price;
@OneToMany(mappedBy = "food",fetch = FetchType.EAGER)
private List<Orders> orders = new ArrayList<>();
public Food(String foodName, int price) {
this.foodName = foodName;
this.price = price;
}
}
|
cs |
Member와 Team vs Order의 Member차이
|
1
2
3
4
|
// Member의 Team쪽
@ManyToOne
@JoinColumn(name="team_id")
private Team team;
|
cs |
|
1
2
3
4
|
// Order의 Member쪽
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
|
cs |
- 차이가 보이시나요? 네 Many쪽은 없습니다..
- 그렇다면 실제 DataBase에는 차이가 어떻게 반영됐었죠? 네 없습니다, 기본적으로 DB의 외래키는 양방향에서 조회는 가능합니다! 데이터베이스 상에는 변경될게 없다는거죠!
'TIL' 카테고리의 다른 글
| 2022.12.16 MySelectShop (0) | 2022.12.18 |
|---|---|
| 2022.12.15 JPA 심화(4) (0) | 2022.12.16 |
| 2022.12.13 JPA 심화 (2) (0) | 2022.12.13 |
| 2022.12.12 입문 주차 복습, 영속성 (0) | 2022.12.12 |
| [WIL] 2022.12.05 ~ 12.09 스프링 입문 (1) | 2022.12.12 |