슬기로운 개발생활

[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 적용
반응형

블로그의 정보

슬기로운 개발생활

coco3o

활동하기