[Error] TransientPropertyValueException: object references an unsaved transient
by coco3o반응형
코드로 배우는 스프링부트 웹프로젝트를 공부 하던 중 연관관계 테스트 부분에서 테스트 데이터를 추가하고 있는데
아래와 같이 TransientPropertyValueException의 오류가 났다.
org.hibernate.TransientPropertyValueException:
object references an unsaved transient instance - save the transient instance before flushing :
org.coco.board.entity.Board.writer -> org.coco.board.entity.Member
원인
구글링을 통해 알아보니 원인은 영속성 때문에 나는 오류라고 한다.
FK로 쓰는 객체가 아직 저장이 안되서 나오는 오류이다.
객체간 @OneToMany, @ManyToOne같은걸 쓸 때 위와 같은 오류가 날 수 있다고 한다.
해결
위와 같은 오류의 해결 방법은
Join 하는 쪽에 cascade를 설정해주면 된다.
cascade = CascadeType.ALL
@ManyToOne(cascade = CascadeType.ALL)
...
※CascadeType의 종류
- CascadeType.PERSIST
- 엔티티를 생성하고, 연관 엔티티를 추가한 상태로 영속화할 때 연관 엔티티도 함께 psersist()가 수행된다.
- CascadeType.MERGE
- 트랜잭션이 종료되고 detach상태에서 연관 엔티티를 추가하거나 변경된 이후에 부모 엔티티가 merge를 수행하게 되면 변경사항이 연관 엔티티에도 적영된다.
- CascadeType.REFRESH
- 엔티티를 새로고칠 때, 이 필드에 보유된 엔티티도 새로고친다.
- CascadeType.REMOVE
- 엔티티를 삭제할 때, 이 필드에 보유된 엔티티도 삭제한다.
- CascadeType.DETACH
- 부모 엔티티가 detach()를 수행하게 되면, 연관된 엔티티도 detach() 상태가 되어 변경사항이 반영되지 않는다.
- CascadeType.ALL
- 모든 Cascade 적용
반응형
'📌ETC > Error' 카테고리의 다른 글
블로그의 정보
슬기로운 개발생활
coco3o