#code RestAPI를 만드면서 게시글 기능을 개발하는 도중 해당 오류를 마주치게 되었다.
아마 외래키 문제로 보인다..
추후에도 또 발생할 것을 염려하여 포스트하기로 하였다.
일단
nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing :
라는 에러를 뱉었는 데
원인
@OneToMany와 @ManyToOne 어노테이션을 사용하면 자주 볼 수 있는 에러라고 한다.
JPA를 사용하여 초기 데이터를 만들다가
부모 객체에서 자식 객체를 바인딩하여 한 번에 저장하려다가 자식 객체가 아직 데이터베이스에 저장되지않아 발생함
원인 예시
// ... 비지니스 로직
User user = User.builder()
.name("Admin")
.build();
Post post = Post.builder()
.title("This is Title")
.content("This is Content")
.writer(user)
.build();
postRepository.save(post);
User가 저장되어있지 않으니, 당연하게도 Post를 저장하는 데에도 문제가 발생함
해결 방안
부모객체에 cascade 옵션을 추가하여 해결할 수 있다.
CascadeType.ALL 로 추가하면 왠만해서는 해결된다.
그래도 해결이 안된다면 자식 객체에도 cascade = CascadeType.ALL 추가하면 해결된다.
위 cascade는 영속성 전이 라는 건데 특정 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화합니다.
더 많은 정보
저장만 할때에는 cascade를 CascadeType.PERSIST로 하면 된다.
전체적용은 위에서 사용한 CascadeType.ALL입니다.
위 원인 예시와 같이 할 때 엔티티를 위와 같이 영속성 전이를 설정하면
Post를 저장하기 전, User를 먼저 저장합니다.
참조
'Spring' 카테고리의 다른 글
[Spring] 빈 (Bean) 설명 (0) | 2022.01.31 |
---|---|
[Spring] Spring Core 설명 (0) | 2022.01.30 |
Spring Boot 파일(이미지) 업로드하기 (0) | 2022.01.24 |
Spring Entity 날짜 자동 저장 (0) | 2022.01.19 |
Spring & React 결합 (버그와 오류들) (0) | 2022.01.14 |