2011-10-08 30 views
15
@Entity 
public class Report extends Model { 

    public Date date; 
    public double availability; 

    @ElementCollection 
    @Cascade(value={CascadeType.ALL}) 
    public Map<FaultCategory, Integer> categories;  
} 

Trong một trong những công việc của tôi, tôi có đoạn mã sau:Làm cách nào để tôi có thể xóa một bộ sưu tập là một phần của thực thể jpa?

int n = MonthlyReport.delete("date = ?", date); 

này luôn thất bại trong việc xóa các thực thể có các lỗi sau:

The DELETE statement conflicted with the REFERENCE constraint "FK966F0D9A66DB1E54". The conflict occurred in database "TFADB", table "dbo.MonthlyReport_categories", column 'MonthlyReport_id'.

Làm thế nào tôi có thể xác định bản đồ như vậy các yếu tố từ bộ sưu tập danh mục sẽ bị xóa khi báo cáo bị xóa?

+0

JPA không hỗ trợ xóa tầng trên phần tử sưu tập (xem thêm [đây] (http://stackoverflow.com/q/3903202/741249)) – THelper

Trả lời

26

Xóa tầng (và các hoạt động xếp tầng nói chung) chỉ có hiệu quả khi hoạt động được thực hiện qua EntityManager. Không phải khi xóa được thực hiện dưới dạng xóa hàng loạt thông qua truy vấn JP QL/HQL. Bạn không thể chỉ định ánh xạ sẽ loại bỏ chuỗi thành các phần tử trong ElementCollection khi việc xóa được thực hiện thông qua truy vấn.

ElementCollection chú thích không có thuộc tính xếp tầng, bởi vì các thao tác luôn được xếp chồng. Khi bạn xóa đối tượng của mình qua EntityManager.remove(), hoạt động được xếp chồng lên ElementCollection.

Bạn phải tìm nạp tất cả MonthlyReport đối tượng mà bạn muốn xóa và gọi EntityManager.remove cho từng đối tượng. Có vẻ như thay vì điều này trong khung chơi, bạn cũng có thể gọi phương thức xóa trong thực thể.

+0

Vì vậy, cách nào đúng để xóa các danh mục? Tôi đã nhận thấy rằng nếu tôi đặt chìa khóa nước ngoài để cascade trên cơ sở dữ liệu chính nó, các MonthyReport.delete thực sự thành công. – emt14

+0

Đã thêm vào câu trả lời, chỉ cần tìm nạp chúng với ngày của bạn =? -các tiêu chí và xóa/xóa từng cái một. Sau đó, xóa sẽ được xếp vào các danh mục. –

+0

Điều đó đã thực hiện các mẹo rất độc đáo. cảm ơn. – emt14

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