Spring 숙련 19 (고아 엔티티 지우기(Orphan)) ()
대충
이런 상황
유저 테이블

음식 테이블

연관관계 제거 하는
@Transactional
void test1() {
// 고객 Robbie 를 조회합니다.
User user = userRepository.findByName("Robbie");
System.out.println("user.getName() = " + user.getName());
// 연관된 음식 Entity 제거 : 후라이드 치킨
Food chicken = null;
for (Food food : user.getFoodList()) {
if(food.getName().equals("후라이드 치킨")) {
chicken = food;
}
}
if(chicken != null) {
user.getFoodList().remove(chicken);
}
// 연관관계 제거 확인
for (Food food : user.getFoodList()) {
System.out.println("food.getName() = " + food.getName());
}
}
//
Hibernate:
/* <criteria> */ select
u1_0.id,
u1_0.name
from
users u1_0
where
u1_0.name=?
user.getName() = Robbie
Hibernate:
select
ol1_0.user_id,
ol1_0.id,
ol1_0.name,
ol1_0.price
from
food ol1_0
where
ol1_0.user_id=?
food.getName() = 고구마 피자
food.getName() = 아보카도 피자
그렇지만 연관 관계 제거만 으로는 sql 테이블에서는 제거 되지 않습니다
그래서 Orphan 을 사용 해서 연관 관계 제거만으로 도 삭제되게끔.
orphanRemoval = true
@OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST,orphanRemoval = true)
private List<Food> orderList = new ArrayList<>();
CascadeType.REMOVE 랑 마찬가지로 orphanRemoval = true 도 연관 된 엔티티를 삭제 합니다.
(orphanRemoval 이 CascadeType.REMOVE 기능 도 포함 하고 있다)
* 삭제 하려고 하는 연관된 엔티티를 다른곳에서도 참조 하고 있는지 아닌지를 꼭 확인 해야 합니다.
A - B - C 에서 A 로 B 도 같이 삭제 되면
C 에서 문제가 발생 할수 있습니다.
* @ManyToOne 에서는 사용 할수 없습니다.