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 |