오봉이와 함께하는 개발 블로그
object references an unsaved transient instance - save the transient instance before flushing (Cascade 오류) 본문
Artineer 리뉴얼 프로젝트
object references an unsaved transient instance - save the transient instance before flushing (Cascade 오류)
오봉봉이 2022. 10. 19. 15:33728x90
에러 내용
JPA를 사용하는데, 연관 관계를 맺어놓은 엔티티를 생성해서 저장하려고 하니 object references an unsaved transient instance - save the transient instance before flushing
라는 에러가 발생했다.
공지를 작성할 때 파일을 업로드 할 수 있고, 업로드한 파일의 원본 이름과 서버에 저장하는 이름을 UploadFild
테이블에 저장해서 파일을 다시 다운로드 받을 때 원래 파일 이름으로 다운로드 받을 수 있도록 구성했다.
이를 위해 공지(Notice
) 테이블을 주 테이블로 설정해서 @OneToOne
양방향 매핑을 했는데, 외래키를 가지고 있는 Notice
테이블을 persist
할 때 문제가 발생했다.
UploadFile uploadFile = fileStore.storeFile(dto.getUploadFile());
Notice writeNotice = Notice.writeNotice(loginMember, LocalDateTime.now(), dto.getTitle(),
dto.getDetail(), uploadFile, 0L)
// 저장하는 메소드
// 에러 발생지점
// uploadFile의 기본키를 외래키로 넣어야 하는데, UploadFile의 id값을 모른다.(없다)
Notice saveNotice = noticeService.saveNotice(writeNotice);
해결방법
매우 간단한 해결 방법이다.Notice
에 값을 저장할 때 외래키로 설정한 UploadFile
테이블이 없기 때문에 발생한 문제이기 때문에 UploadFile
도 같이 등록하면 해결할 수 있다.
연관 관계 매핑을 할 때 매핑 어노테이션에 cascade
옵션을 설정하면 된다.cascade
는 영속성 전이라고 하는 개념으로, 특정 엔티티를 영속화 할 때 연관된 엔티티도 함께 영속화 한다.
저장할 때만 사용하면 cascade = CascadeType.PERSIST
, 전체 적용으로 설정하려면 cascade = CascadeType.ALL
로 적용하면 된다.
728x90
'Artineer 리뉴얼 프로젝트' 카테고리의 다른 글
JPA 연관관계 삭제 (0) | 2022.11.04 |
---|---|
게시판 검색 페이징 - 쿼리스트링 (0) | 2022.10.27 |
비밀번호 찾기 이메일 전송 [JavaMailSender(SimpleMailSender, MimeMessage)] (0) | 2022.09.28 |
보완할 기능 (0) | 2022.09.27 |
Interceptor 적용 (0) | 2022.09.27 |
Comments