2011-11-12 28 views
5

Tôi muốn biết mà thực hiện phương pháp loại bỏ là tốt hơn:JPA và DAO thực hiện hoạt động xóa

public void remove(T t) { 
    entityManager.remove(entityManager.merge(t)); 
} 

public void remove(PK pk) { 
    entityManager.remove(entityManager.getReference(entityType, pk)); 
} 

Tôi đã đọc khá nhiều bài viết về vấn đề này và trong hầu hết các một trong số họ nó tương tự như cách tiếp cận đầu tiên, xuất hiện với tôi khá vô dụng vì nó có thể được thực hiện mà không cần lấy toàn bộ thực thể từ cơ sở dữ liệu (nếu nó không có trong bối cảnh kiên trì) và sau đó loại bỏ nó. Có điều gì tôi thiếu và cách tiếp cận đầu tiên thực sự tốt hơn?

+1

Tại sao bạn không gọi 'entityManager.remove (t) '? – stacker

+0

@stacker: Tôi muốn phương pháp này loại bỏ cả các thực thể được quản lý và tách rời. – VaclavDedik

Trả lời

1

Bạn có thể kiểm tra xem các thực thể được quản lý bằng cách gọi

boolean isManaged = entityManager.contains(t); 

Nếu đúng chỉ cần gọi

entityManager.remove(t); 

khác tiếp cận thứ hai của bạn có vẻ tốt hơn kể từ khi sáp nhập có thể gây ra hoạt động db hơn do tải háo hức (nếu được cấu hình). Các javadoc trên getReference nói "Nhận một thể hiện, có nhà nước có thể được lazily lấy.Nếu trường hợp yêu cầu không tồn tại trong cơ sở dữ liệu, ném EntityNotFoundException khi nhà nước dụ là lần đầu tiên truy cập. (Thời gian chạy nhà cung cấp kiên trì được phép ném EntityNotFoundException khi getReference (java.lang.Class, java.lang.Object) được gọi.) Ứng dụng không nên mong đợi rằng trạng thái cá thể sẽ có sẵn khi tách rời, trừ khi nó được truy cập bởi ứng dụng trong khi trình quản lý thực thể đã được mở. "

Nói tóm lại các tổ chức phải được quản lý therfore, tôi xin đề nghị:

em.remove(em.contains(r) ? r : em.merge(r)); 
+0

Giải pháp này có vẻ tốt, tuy nhiên, tôi muốn được biết rằng có ai thực hiện bất kỳ phép đo nào nếu thực hiện truy vấn JPQL/HQL dọc theo dòng "DELETE FROM Entity e WHERE e.id =: id" sẽ nhanh hơn gọi hợp nhất và sau đó loại bỏ, khi thực thể không được chứa trong trình quản lý? Liệu chi phí của việc xây dựng một truy vấn thừa cân không cần phải lấy thực thể? – esaj

+1

Có vẻ như không cần thiết đối với tôi, nếu thực thể có mặt trong ngữ cảnh kiên trì, gọi em.merge (r) trả về tham chiếu đến thực thể được quản lý. Đó không phải là câu hỏi này là gì. Điều làm phiền tôi là khi thực thể không hiện diện trong bối cảnh kiên trì .. bởi vì sau đó phương thức hợp nhất phải lấy thực thể từ cơ sở dữ liệu, trong trường hợp này dường như không cần thiết vì tôi chỉ cần xóa một hàng khỏi cơ sở dữ liệu. – VaclavDedik

Các vấn đề liên quan