@Table(name = "post")
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "post_id")
private Long id;
@OneToMany(mappedBy = "postId", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<File> files;
}
위와 같이 @OneToMany 관계로 설정된 files
Post post = postRepository.findById(postRequest.getPostId()).get(); // 1
fileRepository.deleteAllByIdInBatch(postRequest.getDeletedFileId()); // 2
// Post 엔티티를 업데이트하고 반환
Post newPost = postRepository.save(post); // 3
기존 코드를 단순화해보았다
Delete가 제대로 작동하지 않는 이유는 너무나 당연하고 간단했다
(1) post 객체를 미리 가져온 후 (2) File 엔티티를 삭제하게 되면 분명 정상적으로 삭제되는 것을 확인할 수 있지만, post에 관계로 설정되어있던 files이 (3) post가 저장되는 시점에서 다시 새로운 객체로 저장되게 된다. (fileId = 1 -> 2로 변경)
따라서 post.setFiles(null) 과 같이 설정해서 관계를 잠시 끊어주거나, Post 객체를 받아오는 시점을 File이 삭제된 이후로 잡아야 한다.