【发布时间】:2012-01-07 21:37:53
【问题描述】:
如果我尝试通过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 错误?
更新
这似乎是一个休眠问题。 delete 和 update 语句的顺序。以下 hack 解决了问题(部分):
@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 不适用于我的解决方法。它导致下一个异常:“拥有的实体实例不再引用具有 cascade="all-delete-orphan" 的集合”。所以问题并没有真正解决。
【问题讨论】:
-
太好了,黑客对我有用!我的场景如下:我从列表中删除了第一个元素,然后将元素附加到列表的末尾。
标签: java hibernate jpa unique-constraint