2011-08-22 41 views
6

Đôi khi nó khá khó khăn (hoặc một vấn đề hiệu suất) để xóa tất cả các tham chiếu đến một thực thể.Lỗi "Không tìm thấy thực thể" với JPA

Ví dụ: tôi có đối tượng Person có mối quan hệ với đối tượng Person khác.

Khi tôi xóa một người, tôi không muốn xóa người này trong tất cả các mối quan hệ mà cô ấy có thể đơn giản vì đôi khi đối tượng Person này không biết nó được tham chiếu ở đâu. Vì vậy, nếu tôi muốn xóa sạch tất cả các tài liệu tham khảo, tôi phải làm thêm sql làm việc có thể dẫn đến vấn đề hiệu suất. Trong một thế giới lý tưởng, tôi muốn xóa đối tượng Person và khi một Person khác thực hiện tham chiếu đến Person này (vì nó có id của nó trong các quan hệ của nó), đơn giản trả về null.

Thực tế là JPA phàn nàn rằng

javax.persistence.EntityNotFoundException: No row with the given identifier exists 

Có cách nào để buộc JPA để trả về một tham chiếu null và không phải là một ngoại lệ trong trường hợp này?

Trả lời

16

Bạn có thể sử dụng chú thích @NotFound với giá trị NotFoundAction.IGNORE, sẽ trả về giá trị rỗng nếu thực thể được liên kết không tồn tại.

Một lời cảnh báo: nếu bạn sử dụng điều này trong một bộ sưu tập và ngủ đông không tìm thấy một trong các mục, nó sẽ thêm một giá trị null trong bộ sưu tập, điều này rất khó chịu. Để tránh điều này, bạn có thể bọc bộ sưu tập trong Bộ sưu tập bỏ qua số không.

+0

đó chính xác là những gì tôi đang tìm kiếm! Cảm ơn bạn rất nhiều. Điều này là hibernate cụ thể, phải không? –

+1

Tôi rất vui vì nó đã giúp và có, chú thích là hibernate cụ thể – Augusto

+0

@Augusto Tại sao dữ liệu Spring lại ném ngoại lệ này ngay từ đầu? – svlada

5

Không, ít nhất là không có gì tiêu chuẩn (JPA)

Nhưng bạn có thể kiểm soát những gì sẽ xảy ra với các hiệp hội sử dụng các thuộc tính cascade ot @*ToMany@*ToOne chú thích.

0

Bạn muốn sử dụng @NotFound (action = NotFoundAction.IGNORE) điều này sẽ bỏ qua các thực thể null. NHƯNG (như Augusto đã nói) nếu bạn đang sử dụng ví dụ Primefaces Datatable và nhận 10 hàng và bỏ qua 2, vì @NotFound (action = NotFoundAction.IGNORE) trong thuộc tính của bạn, bạn sẽ có 10 hàng và không 8 (hàng ma thực sự).

@NotFound(action=NotFoundAction.IGNORE) 
private Product p; 
Các vấn đề liên quan