오봉이와 함께하는 개발 블로그

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:33
728x90

에러 내용

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
Comments