Khác nhau ở thời điểm kích hoạt, không phải ở kết quả xoá.
CascadeType.REMOVE: chỉ chạy khi xoá entity cha. XoáOrderthì cácOrderItembị xoá theo.orphanRemoval = true: chạy khi child bị tách khỏi cha, dù cha vẫn tồn tại. Gỡ mộtOrderItemkhỏiorder.getItems()là nó bịDELETE.
java
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
private List<OrderItem> items = new ArrayList<>();
// có orphanRemoval: row bị xoá
order.getItems().remove(item);
// không có nó: chỉ set FK về null -> lỗi nếu cột là NOT NULLKhi nào bắt buộc: quan hệ composition — child không có ý nghĩa khi tách khỏi cha (dòng chi tiết đơn hàng, ảnh của một sản phẩm, địa chỉ của một user). Không có orphanRemoval, Hibernate chỉ set FK về null và câu lệnh sẽ lỗi nếu cột FK là NOT NULL, hoặc để lại dữ liệu mồ côi.
Không dùng cho quan hệ association như Post - Tag: gỡ một tag khỏi bài viết không có nghĩa là xoá tag khỏi hệ thống. Với @ManyToMany thì càng phải tránh CascadeType.REMOVE — xoá một bài viết có thể kéo theo tag mà bài khác đang dùng.