코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

스프링

EntityNotFoundException: Unable to find com.aloharoombackend.model.HomeImage with id 1

2023. 2. 28. 16:26

 

 

https://bkjeon1614.tistory.com/35

 

javax.persistence.EntityNotFoundException: Unable to find ... with id 0 에러

데이터를 저장할 때 @OneToOne, @OneToMany.. 등의 annotation이 선언되어 있을 경우에는 매핑된 id값이 0이거나 매핑되어있는 id의 자식객체가 없을 때 오류가 발생하는 경우가 있다. 이 경우 매핑되는 애

bkjeon1614.tistory.com

https://sbe03005dev.tistory.com/entry/JPA-orphanRemoval

 

[JPA] orphanRemoval

부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제해주는 기능이다. @Entity public class Parent { @Id @GeneratedValue private Long id; private String username; @OneToMany(mappedBy = "parent", cascade = CascadeType.A

sbe03005dev.tistory.com

 

기존

Home

@Entity
@Getter
@NoArgsConstructor
public class Home {
	...
    @OneToMany(mappedBy = "home")
    private List<HomeImage> homeImages = new ArrayList<>();
	...
 }

BoardController

//게시물 삭제
    @DeleteMapping("/{boardId}")
    public ResponseEntity deleteBoard(@PathVariable Long boardId) {
        //board, home, homeImage 삭제
        Board board = boardService.findOne(boardId);
        Home home = homeService.findOne(board.getHome().getId());
        List<HomeImage> homeImages = home.getHomeImages();

        boardService.delete(board);
        homeImages.forEach(homeImageService::delete);
        homeService.delete(home); //여기서 문제

        return ResponseEntity.ok("");
    }
  • 이때, Home은 삭제된 HomeImage를 가지고 있는데 Home을 삭제해버리면 해당 HomeImage가 없으므로 오류 발생
  • Home 먼저 삭제하면 되지 않느냐 => HomeImage가 Home을 참조하고 있기때문에 Home 먼저 삭제가 불가능

 

해결

Home

@Entity
@Getter
@NoArgsConstructor
public class Home {
	...
    @OneToMany(mappedBy = "home", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<HomeImage> homeImages = new ArrayList<>();
	...
 }
  • orphanRemoval: 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제해주는 기능이다.
  • Home이 HomeImage의 생명주기를 관리한다.
    • DB에서 Home을 삭제하면 연관된 HomeImage도 삭제

BoardController

//게시물 삭제
    @DeleteMapping("/{boardId}")
    public ResponseEntity deleteBoard(@PathVariable Long boardId) {
        //board, home, homeImage 삭제
        Board board = boardService.findOne(boardId);
        Home home = homeService.findOne(board.getHome().getId());
        List<HomeImage> homeImages = home.getHomeImages();

        boardService.delete(board);
        homeService.delete(home); //HomeImage의 생명주기를 관리함으로 Home을 삭제하면 연관된 HomeImage들이 삭제된다.

        return ResponseEntity.ok("");
    }
  • Home을 삭제하면 연관된 HomeImage도 삭제

'스프링' 카테고리의 다른 글

Subquery returns more than 1 row  (0) 2023.03.04
@OneToOne 양방향 LazyLoading 실패  (0) 2023.02.28
Spring Boot 파일 업로드 용량 제한 설정  (0) 2023.02.23
스프링 부트 - 오류 페이지  (0) 2022.08.20
[스프링 MVC 2편] 로그인 처리2 - 필터, 인터셉터  (1) 2022.07.14
    '스프링' 카테고리의 다른 글
    • Subquery returns more than 1 row
    • @OneToOne 양방향 LazyLoading 실패
    • Spring Boot 파일 업로드 용량 제한 설정
    • 스프링 부트 - 오류 페이지
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바