카테고리 없음

[Java Spring] Orphan Entity delete

Luke_look 2023. 7. 9. 23:04

Orphan Entity delete

@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());
    }
}

이 코드를 보면 로비 고객을 조회하고 후라이드 치킨을 삭제합니다.

자세히 말하면 user.getFoodList().remove(chicken)을 통해 컬렉션에서 삭제하는 것을 알 수 있습니다. 그래서 알아야 하는 것이 고아 엔티티 삭제입니다.

image-20230709184000545

콘솔에서는 삭제된 것으로 나옵니다. 그러나

image-20230709184032108

데이터베이스에서 후라이드 치킨은 건재하다는 것을 알 수 있습니다.

이는 컬렉션에서만 삭제하였기 떄문입니다.

그래서

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

orphanRemoval = true를 통해 데이터베이스에서 삭제할 수 있습니다.

코드를 실행해보면

image-20230709184143690

콘솔에서도 잘 삭제 되어 나오고

image-20230709184206079

데이터베이스에서도 잘 삭제가 되었습니다.

public class Excercise14_5 {
    public static void main(String[] args) {
        String[] strArr = { "aaa", "bb", "c", "dddd" };
        int maxLength = 0;

        for(String str : strArr) {
            if(str.length() > maxLength) {
                maxLength = str.length();
            }
        }

        System.out.println("num : " + maxLength);
    }
}