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인 상황에서 흔히 만나는 에러라고 한다.
내 프로젝트에서는 Oreder와 OrderItem 엔티티가 있는데
Order와 OrderItem은 1:N 관계로,
Order 엔티티에는 아래와같이 OrderItem을 @OneToMany로 가져오고 있고,
OrderItem 엔티티에는 아래와 같이 Order을 @ManyToOne으로 가져오고 있다.
위의 에러는
부모 객체인 Order를 바인딩하여 한번에 저장하려는데
자식 객체인 OrderItem이 아직 데이터베이스에 저장되지 않았기 때문에 발생한다고 한다.
따라서 부모 객체인 Order에 자식 객체까지 한번에 저장되도록 Cascade 옵션을 추가하면 된다고 하는데
나는 이미 옵션을 가지고 있었다.
그런데 가끔 이렇게 해서 안먹힐 때가 있어서, 그 때는 자식 객체인 OrderItem에도 cascade 옵션을 추가해주면 된다고 한다 !
따라서 아래와 같이 cascade = CascadeType.ALL을 추가해주니 에러가 해결되었다 ~