Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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 30 31
Tags more
Archives
Today
Total
관리 메뉴

요리사에서 IT개발자로

스파르타 부트캠프 Spring Master 3강 고아Entity 삭제(orphanRemoval) 본문

Spring

스파르타 부트캠프 Spring Master 3강 고아Entity 삭제(orphanRemoval)

H.S-Backend 2024. 5. 29. 17:29

CACADE의 REMOVE옵션을 적용하면 

해당 Entity 객체를 삭제할 때 연관된 Entity 객체들을 자동 삭제할 수 있다.

https://hs-backend.tistory.com/166

 

스파르타 부트캠프 Spring Master 3강 영속성 전이

@Test@DisplayName("Robbie 음식 주문")void test1() { // 고객 Robbie 가 후라이드 치킨과 양념 치킨을 주문합니다. User user = new User(); user.setName("Robbie"); // 후라이드 치킨 주문 Food food = new Food(); food.setName("후라

hs-backend.tistory.com

 

REMOVE 옵션같은 경우 연관된 Entity를 제거했다해서

자동으로 해당 User Entity가 삭제되지 않는다?

@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); //외래키 설정
    }
}

 Robbie의 user_id 는 1

Food 테이블에서 Robbie가 주문한 음식들

고구마피자, 아보카도피자, 후라이드 치킨이다.

@Test
@Transactional
@Rollback(value = false)
@DisplayName("연관관계 제거")
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());
    }
}

 

실행을하면 후라이드 치킨이 삭제되고 연관관계도 삭제되어야하는데....

연관관계는 제거했으나

데이터는 그대로 남아있다?


JPA에서는 이를 간편하게 처리할 수 있도록

orphanRemoval옵션을 제공한다.

@OneToMany(mappedBy = "user",cascade = CascadeType.PERSIST,orphanRemoval = true)

 orphanRemoval옵션 추가 코드

package com.sparta.jpaadvance.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

@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,orphanRemoval = true)
    private List<Food> foodList = new ArrayList<>();

    public void addFoodList(Food food) {
        this.foodList.add(food);
        food.setUser(this); //외래키 설정
    }
}

 

삭제 테스트 코드를 변경하지 않고 실행을 하면

Delete가 수행되어 후라이드 치킨데이터가 삭제된다.


orphanRemoval옵션
REMOVE 옵션과 마찬가지로 Robbie Entity를 삭제하면

연관 Food Entity가 자동삭제된다.

 

 

orphanRemoval이나 REMOVE옵션 사용하면 

연관된 Entity가 다른 곳에서 참조하고있는지 아닌지를 확인해야 한다.

 

A는 B,C 연관관계

B는 C를 연관 할때

B를삭제하면 C도삭제된다.

A는 C도 B도없다.

 

orphanRemoval같은 경우 @ManyToOne같은 에너테이션에서 사용할 수없다.

반응형