Order와 OrderProduct는 1:N 관계로 Order삭제시 관련된 OrderProduct를 모두 삭제 처리하려고 합니다.
@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
설정
@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;
}
JPA에서 삭제 작업을 커스터마이징할 때 사용하는 어노테이션입니다.
삭제작업시 설정한 SQL실행.
Soft delete처리하기 위해 실제로 삭제하지 않고 is_deleted 속성을 true로 설정합니다.
삭제처리를 cascade하기 위해 OrderProduct에도 @SQLDelete
를 설정합니다.
@SQLRestriction은 JPA에서 특정 엔티티에 대한 조회 시 적용할 조건을 지정하는 어노테이션입니다.
SQL을 조회할 때 삭제처리된 데이터를 조회하지 않기 위해 is_deleted = false
조건 설정.