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<>();
// with orphanRemoval: row is deleted
order.getItems().remove(item);
// without it: only the FK is set to null -> fails if the column is 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.