如果我嘗試通過removeTask
方法嘗試從TaskList
中刪除Task
,我有以下實體並得到一個異常。使用訂購的休眠列表的唯一約束違規
@Entity
public class TaskList extends GenericModel {
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@OrderColumn(name="position", nullable=false)
public List<Task> tasks = new ArrayList<>();
// ...
public void removeTask(Task task) {
tasks.remove(task);
}
}
@Entity
public class Task extends Model {
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="task_id")
private List<Reservation> reservations = new ArrayList<>();
@ManyToOne
public TaskList taskList;
// ...
}
@Entity
public class Reservation extends GenericModel {
@Id
private String id = Token.generate(8);
@ManyToOne
private Task task;
// ...
}
唯一的例外是:
"CONSTRAINT_INDEX_F ON PUBLIC.TASKLIST_TASK(TASKS_ID)"
Unique index or primary key violation: "CONSTRAINT_INDEX_F ON PUBLIC.TASKLIST_TASK(TASKS_ID)"; SQL statement:
update TaskList_Task set tasks_id=? where TaskList_id=? and position=? [23001-149]
我使用JPA 2與Hibernate 3.6.1。我的映射有問題嗎?或者它是一個Hibernate錯誤?
UPDATE
這似乎是一個休眠問題。聲明的順序爲delete
和update
。下面的技巧解決了這個問題(部分):
@Entity
public class TaskList extends GenericModel {
// ....
public void removeTask(Task task) {
tasks.remove(task);
tasks = new ArrayList<>(tasks); // only for Hibernate
task.taskList = null;
}
}
但是orphanRemoval=true
不適用於我的解決方法。它會導致下一個異常:「具有級聯的集合=」all-delete-orphan「不再由擁有的實體實例引用。所以這個問題並沒有真正解決。
很好,黑客爲我工作!我的場景如下:我從列表中刪除了第一個元素,然後將該元素添加到列表的末尾。 – rwitzel 2014-01-23 19:59:25