본문 바로가기
Spring

Spring 숙련 19 (고아 엔티티 지우기(Orphan)) ()

by sehunbang 2024. 1. 31.

대충

이런 상황

유저 테이블

음식 테이블

 

 

연관관계 제거 하는

@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 에서는 사용 할수 없습니다.