cuốn sách gpt4 ai đã làm

android — Danh sách Hibernate được đặt hàng vi phạm ràng buộc duy nhất

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 08:24:52 27 4
mua khóa gpt4 Nike

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;

// ...
}

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ỏ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.

câu trả lời hay nhấ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.

Về danh sách Hibernate được đặt hàng java vi phạm ràng buộc duy nhất, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/8773311/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress