Tôi có các thực thể sau và nếu tôi cố gắng vượt qua xóa nhiệm vụ
Phương pháp từ Danh sách nhiệm vụ
Xóa trong Task
, một ngoại lệ sẽ xảy ra.
@Entity
lớp công khai TaskList mở rộng GenericModel {
@OneToMany(cascade=CascadeType.ALL, tìm nạp=FetchType.EAGER)
@OrderColumn(name="position", nullable=false)
public List task = new ArrayList<>();
// ...
public void deleteTask(Nhiệm vụ nhiệm vụ) {
nhiệm vụ.remove (nhiệm vụ);
}
}
@Entity
lớp công khai Nhiệm vụ mở rộng Mô hình {
@OneToMany(cascade=CascadeType.ALL, tìm nạp=FetchType.EAGER)
@JoinColumn(name="task_id")
Danh sách riêng<đặt chỗ=""> đặt chỗ = new ArrayList<>();
@ManyToOne
Danh sách nhiệm vụ công khai;
// ...
}
@Entity
lớp công khai Đặt chỗ mở rộng GenericModel {
@Id
Id chuỗi riêng = Token.generate(8);
@ManyToOne
nhiệm vụ nhiệm vụ riêng;
// ...
}
đặt>
Các trường hợp ngoại lệ là:
"CONSTRAINT_INDEX_F TRÊN PUBLIC.TASKLIST_TASK(TASKS_ID)"
Vi phạm chỉ mục hoặc khóa chính duy nhất: "CONSTRAINT_INDEX_F TRÊN PUBLIC.TASKLIST_TASK(TASKS_ID)";
cập nhật TaskList_Task đặt task_id=? trong đó TaskList_id=? và vị trí= [23001-149]
Tôi đang sử dụng JPA 2 và Hibernate 3.6.1. Có vấn đề gì với bản đồ của tôi hoặc lỗi Hibernate không?
gia hạn
Đây có vẻ là sự cố Hibernate. Và xóa bỏ
Và update
Tuyên bố nội dung liên quan đến trật tự. Bản hack sau giải quyết vấn đề này (một phần):
@Entity
lớp công khai TaskList mở rộng GenericModel {
// ....
public void deleteTask(Nhiệm vụ nhiệm vụ) {
nhiệm vụ.remove (nhiệm vụ);
task = new ArrayList<>(task); // chỉ dành cho Hibernate
task.taskList = null;
}
}
Ngủ đông - xóa bộ sưu tập có all-delete-orphan và sau đó thêm vào bộ sưu tập đó gây ra ConstraintViolationExceptionHướng dẫn tôi đi đúng hướng.
Nhưng mồ côiRemoval=true
Cách giải quyết không hiệu quả với tôi. Nó dẫn đến ngoại lệ tiếp theo: "Bộ sưu tập sở hữu tầng = "all-delete-orphan" không còn được tham chiếu bởi phiên bản thực thể sở hữu nữa". Vì vậy, vấn đề không thực sự được giải quyết.
Liên kết hai chiều của bạn được ánh xạ hai lần: một lần trong Danh sách nhiệm vụ và một lần trong Nhiệm vụ. Chú thích ánh xạ trong TaskList phải là
@OneToMany(cascade=CascadeType.ALL, get=FetchType.EAGER, mappedBy="task")
@OrderColumn(name="position", nullable=false)
public List task = new ArrayList<>();
Nếu không có thuộc tính mappedBy, Hibernate sẽ cho rằng bạn có hai liên kết riêng biệt (mà tôi nghi ngờ đó là điều bạn muốn), chứ không phải là liên kết hai chiều.
Ngoài ra, khi bạn sửa đổi liên kết hai chiều, cả hai bên của liên kết đều phải được sửa đổi. Vì vậy, phương thức RemoveTask phải là
public void deleteTask(Nhiệm vụ nhiệm vụ) {
nhiệm vụ.remove (nhiệm vụ);
task.setTaskList(null);
}
Điều này đặc biệt quan trọng vì chủ sở hữu của hiệp hội là Task
(Vì không có được ánh xạBy
tài sản). Vì vậy đây là mặt mà Hibernate kiểm tra để hiểu rằng liên kết phải bị xóa.
Tôi là một lập trình viên xuất sắc, rất giỏi!