JPA @SQLDelete, @SQLRestriction soft delete

dh·2025년 2월 27일
0

JPA

목록 보기
3/4
post-thumbnail

Order테이블과 OrderProduct테이블의 Soft delete cascade

Order와 OrderProduct는 1:N 관계로 Order삭제시 관련된 OrderProduct를 모두 삭제 처리하려고 합니다.

Order Entity

@SQLDelete(sql = "UPDATE p_order SET is_deleted=true WHERE order_id= ?")
@SQLRestriction("is_deleted = false")
@Entity
@Getter
@Table(name = "p_order")
public class Order extends BaseEntity {

    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name="uuid2", strategy = "uuid2")
    @Column(name="order_id", columnDefinition = "BINARY(16)")
    private UUID order_id;

    @Enumerated
    @Column(name = "order_type", nullable = false)
    private OrderType order_type;

    @Column(name = "price", nullable = false)
    private Long price;

    @ManyToOne
    @JoinColumn(name = "member_id")
    private Member member;

    @ManyToOne
    @JoinColumn(name = "store_id")
    private Store store;

    @OneToMany(mappedBy = "order", fetch = FetchType.LAZY, cascade = {CascadeType.REMOVE, CascadeType.PERSIST})
    private List<OrderProduct> orderProducts;


}

OrderProduct에 대해서 cascade = CascadeType.REMOVE 설정

OrderProduct Entity

@SQLDelete(sql = "UPDATE p_order_product SET is_deleted=true WHERE order_product_id= ?")
@SQLRestriction("is_deleted = false")
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Table(name = "p_orderProduct")
public class OrderProduct extends BaseEntity {
    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name="uuid2", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)")
    private UUID orderProductId;

    @ManyToOne
    @JoinColumn(name = "order_id")
    private Order order;

    @ManyToOne
    @JoinColumn(name = "id")
    private Product product;

    @Column(name = "quantity", nullable = false)
    private Long quantity;
}

@SQLDelete

JPA에서 삭제 작업을 커스터마이징할 때 사용하는 어노테이션입니다.
삭제작업시 설정한 SQL실행.
Soft delete처리하기 위해 실제로 삭제하지 않고 is_deleted 속성을 true로 설정합니다.
삭제처리를 cascade하기 위해 OrderProduct에도 @SQLDelete를 설정합니다.

@SQLRestriction

@SQLRestriction은 JPA에서 특정 엔티티에 대한 조회 시 적용할 조건을 지정하는 어노테이션입니다.
SQL을 조회할 때 삭제처리된 데이터를 조회하지 않기 위해 is_deleted = false조건 설정.

0개의 댓글

관련 채용 정보