본문 바로가기

TIL

2022.12.14 JPA심화 (3)

연관관계 관련 심화

단방향 연관관계

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