오늘 목표
- 숙련 주차를 페이징만 듣고 심화로 넘어갈랬는데 숙련을 들어야 심화를 들을 수 있어서 후딱 듣고 심화로 넘어갔다. 오늘 다 들어버리려고 했는데 노는 게 젤 좋아서,, 4시간 분량 중 1시간 반 남았다. 근데 50분어치는 아는 거라서 2배속으로 들을 듯. 낼 다 듣고 과제해야지.
캐스케이드란 ?
엔티티의 상태 변화를 전파시키는 옵션이다. @OneToMany 나 @ManyToOne에 줄 수 있는 옵션이다.
@Entity
@Getter
@Setter
@Table(name = "food")
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
}
여기 음식 엔티티가 있다.
@Entity
@Getter
@Setter
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "user")
private List<Food> foodList = new ArrayList<>();
public void addFoodList(Food food) {
this.foodList.add(food);
food.setUser(this);
}
}
그리고 음식과 N : 1 관계인 사용자가 있다. (사용자 1명당 N개의 음식을 가질 수 있다.)
우선 cascade 가 없으면 유저와 관련된 음식 리스트 삭제는 다음과 같다.
@Test
@Transactional
@Rollback(value = false)
@DisplayName("Robbie 탈퇴")
void test3() {
// 고객 Robbie 를 조회합니다.
User user = userRepository.findByName("Robbie");
System.out.println("user.getName() = " + user.getName());
// Robbie 가 주문한 음식 조회
for (Food food : user.getFoodList()) {
System.out.println("food.getName() = " + food.getName());
}
// 주문한 음식 데이터 삭제
foodRepository.deleteAll(user.getFoodList());
// Robbie 탈퇴
userRepository.delete(user);
}
이 테스트 코드를 실행하면,
Hibernate:
/* <criteria> */ select
u1_0.id,
u1_0.name
from
users u1_0
where
u1_0.name=?
user.getName() = Robbie
Hibernate:
select
fl1_0.user_id,
fl1_0.id,
fl1_0.name,
fl1_0.price
from
food fl1_0
where
fl1_0.user_id=?
food.getName() = 후라이드 치킨
food.getName() = 양념 치킨
Hibernate:
/* delete for com.sparta.jpaadvance.entity.Food */delete
from
food
where
id=?
Hibernate:
/* delete for com.sparta.jpaadvance.entity.Food */delete
from
food
where
id=?
Hibernate:
/* delete for com.sparta.jpaadvance.entity.User */delete
from
users
where
id=?
삭제는 되지만, deleteAll 로 유저가 가진 음식 리스트를 삭제하는 코드를 한번 더 써야 한다. 연관관계에 있는 필드만큼 더 써야 한다.
그러면 이제 cascade 옵션을 다음과 같이,
@Entity
@Getter
@Setter
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "user", cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
private List<Food> foodList = new ArrayList<>();
public void addFoodList(Food food) {
this.foodList.add(food);
food.setUser(this);
}
}
@OneToMany 옵션에 cascade REMOVE 를 넣어주면,
@Test
@Transactional
@Rollback(value = false)
@DisplayName("영속성 전이 삭제")
void test4() {
// 고객 Robbie 를 조회합니다.
User user = userRepository.findByName("Robbie");
System.out.println("user.getName() = " + user.getName());
// Robbie 가 주문한 음식 조회
for (Food food : user.getFoodList()) {
System.out.println("food.getName() = " + food.getName());
}
// Robbie 탈퇴
userRepository.delete(user);
}
다음과 같이 deleteAll 없이도,
Hibernate:
/* <criteria> */ select
u1_0.id,
u1_0.name
from
users u1_0
where
u1_0.name=?
user.getName() = Robbie
Hibernate:
select
fl1_0.user_id,
fl1_0.id,
fl1_0.name,
fl1_0.price
from
food fl1_0
where
fl1_0.user_id=?
food.getName() = 후라이드 치킨
food.getName() = 양념 치킨
Hibernate:
/* delete for com.sparta.jpaadvance.entity.Food */delete
from
food
where
id=?
Hibernate:
/* delete for com.sparta.jpaadvance.entity.Food */delete
from
food
where
id=?
Hibernate:
/* delete for com.sparta.jpaadvance.entity.User */delete
from
users
where
id=?
음식들이 잘 삭제된 것을 볼 수 있다.
<일기>
알고리즘 스터디로 A반 분들 3명과 팀이 된 것을 계기로 A반 사람들과 급속도로 친해지고 있다. 그러곤 기어코 어제 새벽반 사람들과 A-B반 정상회담? 을 했다 ㅋㅋ
A반 7분, B반은 4분이고 나는 왼쪽에서 4번째 빡빡이다 ㅋㅋㅋ
근데 이중에 우리 학교 출신이 2분 계셔서 신기했다. 모두 다 IT건물 쓰는 학과라 학교 다니면서 지나쳤을지도 모르겠네 ,,
A반이랑 교류도 더 많아졌으면 좋겠다. 아니면 내가 주도해서 따로 주말에 스페이스 파서 미니게임 해도 좋을 것 같기도 하고.
사실 방금도 11시에 다들 TIL 쓰고 모여서 롤토체스를 했다 ㅋㅋㅋ 8명 모였다 ㅋㅋㅋㅋㅋㅋ
내배캠 하기 전엔 매일 집에서 공부해야 하니까 너무 답답하지 않을까, 했는데 많은 분들이랑 친해지고 심심하면 수다도 떨고 그래서 생각보단 재밌다. 오늘도 전 팀원분의 현재 팀에 갔더니 새로운 분이랑 친해져서,, 담부턴 팀자리에 무턱대고 갈 수 있을 것 같다 킼킼
</일기>
'TIL ✍️' 카테고리의 다른 글
23년 12월 4일(월요일) - 44번째 TIL (2) | 2023.12.04 |
---|---|
23년 12월 1일(금요일) - 43번째 TIL : validation 검증하기 (0) | 2023.12.01 |
23년 11월 29일(수요일) - 41번째 TIL (1) | 2023.11.29 |
23년 11월 28일(화요일) - 40번째 TIL (0) | 2023.11.28 |
23년 11월 24일(금요일) - 39번째 TIL (0) | 2023.11.24 |