2013-04-18 28 views
6

Trong một thời gian bây giờ tôi đã tự hỏi tại sao khi sử dụng JPA, làm tôi phải viết phương pháp xóa của tôi như thế này:Khi sử dụng thực thể JPAQuản lý tại sao bạn phải hợp nhất trước khi xóa?

@Transactional 
public void delete(Account account) 
{ 
    if (entityManager.contains(account)) 
    { 
     entityManager.remove(account); 
    } 
    else 
    { 
     entityManager.remove(entityManager.merge(account)); 
    } 
} 

Có lẽ chứa là không cần thiết kể từ khi giao dịch bắt đầu và kết thúc với phương pháp này, nhưng tôi vẫn tự hỏi tại sao việc loại bỏ không thể chỉ lấy một vật thể không được quản lý. Có phải vì nó cần phải được quản lý để biết id là gì cho đối tượng đó? Mọi thông tin chi tiết khác sẽ tuyệt vời để nghe. Tôi chỉ muốn hiểu được những con bò và whys của JPA loại bỏ.

Trả lời

10

Thao tác xóa có thể được xếp thành các liên kết của một thực thể.

Để biết các thực thể liên quan cần loại bỏ, người quản lý thực thể không thể dựa vào một thực thể tách rời, vì theo định nghĩa, thực thể tách rời này không phản ánh trạng thái mới nhất của thực thể và không nhất thiết phải có tất cả các liên kết xếp tầng được tải đệ quy.

Vì vậy, nếu nó chấp nhận một thực thể tách rời, remove() sẽ phải quyết định cho bạn: hoặc kết hợp các thực thể tách ra và thực hiện các hoạt động loại bỏ dựa trên những gì thực thể tách rời chứa, hoặc đơn giản là tải các thực thể có cùng một ID là thực thể tách rời và thực hiện thao tác dựa trên thực thể được tải.

Thay vì quyết định cho bạn, chỉ cần yêu cầu một thực thể được đính kèm. Bằng cách đó, bạn quyết định những gì bạn muốn.

+1

Điều đó có ý nghĩa. Cám ơn vì đã chia sẻ. – testing123