Spring

Spring JPA Hibernate 오류. object references an unsaved transient instance - save the transient instance before flushing:

오잎 클로버 2022. 1. 28. 16:00
728x90

#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를 먼저 저장합니다.

 

참조

https://stackoverflow.com/questions/2302802/how-to-fix-the-hibernate-object-references-an-unsaved-transient-instance-save

'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