gpt4 book ai didi

java - 有序 Hibernate 列表违反唯一约束

转载 作者:太空宇宙 更新时间:2023-11-04 08:24:52 27 4
gpt4 key购买 nike

我有以下实体,如果我尝试通过 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;

// ...
}

异常(exception)情况是:

"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 bug?

更新

这似乎是一个 Hibernate 问题。与 deleteupdate 语句顺序相关的内容。以下 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;
}
}

Hibernate - clearing a collection with all-delete-orphan and then adding to it causes ConstraintViolationException引导我走向正确的方向。

但是 orphanRemoval=true 不适用于我的解决方法。它导致下一个异常:“拥有级联=“all-delete-orphan”的集合不再被拥有的实体实例引用”。所以问题并没有真正解决。

最佳答案

您的双向关联被映射两次:一次在 TaskList 中,一次在 Task 中。 TaskList中的映射注解应该是

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="task") 
@OrderColumn(name="position", nullable=false)
public List<Task> tasks = new ArrayList<>();

如果没有mappedBy属性,Hibernate会认为您有两个独立的关联(我怀疑这就是您想要的),而不是双向关联。

此外,当您修改双向关联时,关联的双方都应该被修改。所以removeTask方法应该是

public void removeTask(Task task) {
tasks.remove(task);
task.setTaskList(null);
}

这尤其重要,因为关联的拥有方是 Task(因为那里没有 mappedBy 属性)。所以这是 Hibernate 检查的一侧,以了解必须删除关联。

关于java - 有序 Hibernate 列表违反唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8773311/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com