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
을 추가해주니 에러가 해결되었다 ~