에러 - TransientObjectException : save the transient instance before flushing

박상훈·2024년 8월 6일

에러 로그

목록 보기
3/13

에러 발생 원인

Spring data jpa 사용 중 @OneToMany 어노테이션 사용 중 FK로 사용하는 객체가 저장되기 전에 해당 객체를 사용해 FK를 구성하려다 오류가 발생하였다.

  • Order Entity
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long orderId;
    private String name;

    @OneToMany
    private List<OrderProduct> productIds = new ArrayList<>();

    public Order createOrder(OrderRequestDto orderRequestDto) {
        return Order.builder()
                .name(orderRequestDto.getName())
                .build();
    }

    public OrderResponseDto toResponseDto() {

        List<Long> productIds = new ArrayList<>();
        for(OrderProduct product: this.getProductIds()) {
            productIds.add(product.getId());
        }

        return OrderResponseDto.builder()
                .orderId(this.orderId)
                .productIds(productIds)
                .build();
    }

    public void addOrderProduct(OrderProduct orderProduct) {
        this.productIds.add(orderProduct);
    }

}
  • OrderProduct Entity
public class OrderProduct {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY)
    private Order order;
    private Long productId;

}

해결 방법

  • OrderSevice 중 일부 코드
Long productId = newOrderRequestDto.getProductId();

        OrderProduct orderProduct = OrderProduct.builder()
                .order(order)
                .productId(productId)
                .build();
        orderProductRepository.save(orderProduct); // 이 코드를 삭제 시 오류 발생!

        order.addOrderProduct(orderProduct);

위의 주석이 적힌 부분의 코드를 추가하여 오류를 해결할 수 있었다.

profile
안녕하세요

0개의 댓글