[JPA]object references an unsaved transient instance - save the transient instance before flushing

현주·2023년 7월 12일
1

Trouble Shooting

목록 보기
26/32

🔥 문제

JPA로 프로젝트를 진행하다가 아래와 같은 에러가 발생했다 !

물론 안보일텐데 ^^ 뭐라고 되어있냐면

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.assignment.productmanagementservice.domain.orderItem.entity.OrderItem.order -> com.assignment.productmanagementservice.domain.order.entity.Order; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.assignment.productmanagementservice.domain.orderItem.entity.OrderItem.order -> com.assignment.productmanagementservice.domain.order.entity.Order] with root cause

org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.assignment.productmanagementservice.domain.orderItem.entity.OrderItem.order -> com.assignment.productmanagementservice.domain.order.entity.Order

찾아보니 위 에러는 @OneToMany@ManyToOne인 상황에서 흔히 만나는 에러라고 한다.


💡 원인

내 프로젝트에서는 OrederOrderItem 엔티티가 있는데

OrderOrderItem은 1:N 관계로,

  • Order 엔티티에는 아래와같이 OrderItem@OneToMany로 가져오고 있고,

  • OrderItem 엔티티에는 아래와 같이 Order@ManyToOne으로 가져오고 있다.

위의 에러는

부모 객체인 Order를 바인딩하여 한번에 저장하려는데
자식 객체인 OrderItem이 아직 데이터베이스에 저장되지 않았기 때문에
발생한다고 한다.


☘️ 해결

따라서 부모 객체인 Order에 자식 객체까지 한번에 저장되도록 Cascade 옵션을 추가하면 된다고 하는데

나는 이미 옵션을 가지고 있었다.

그런데 가끔 이렇게 해서 안먹힐 때가 있어서, 그 때는 자식 객체인 OrderItem에도 cascade 옵션을 추가해주면 된다고 한다 !

따라서 아래와 같이 cascade = CascadeType.ALL을 추가해주니 에러가 해결되었다 ~

0개의 댓글