Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有有序休眠列表的唯一约束冲突_Java_Hibernate_Jpa_Unique Constraint - Fatal编程技术网

Java 具有有序休眠列表的唯一约束冲突

Java 具有有序休眠列表的唯一约束冲突,java,hibernate,jpa,unique-constraint,Java,Hibernate,Jpa,Unique Constraint,我有以下实体,如果我试图通过removeTask方法从TaskList中删除任务,则会出现异常 @Entity public class TaskList extends GenericModel { @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) @OrderColumn(name="position", nullable=false) public List<Task> tasks = new

我有以下实体,如果我试图通过
removeTask
方法从
TaskList
中删除
任务,则会出现异常

@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;

  // ...
}
我在Hibernate3.6.1中使用JPA2。我的映射有什么问题吗?还是一个Hibernate错误

更新

这似乎是一个休眠问题。具有
delete
update
语句顺序的内容。以下黑客解决了问题(部分):

@实体
公共类任务列表扩展了GenericModel{
// ....
公共void removeTask(任务){
任务。删除(任务);
tasks=newarraylist(tasks);//仅适用于Hibernate
task.taskList=null;
}
}
带领我的团队朝着正确的方向前进


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

您的双向关联映射了两次:一次在任务列表中,一次在任务中。任务列表中的映射注释应为

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

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

您的双向关联映射了两次:一次在任务列表中,一次在任务中。任务列表中的映射注释应为

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

这一点特别重要,因为关联的拥有方是
Task
(因为那里没有
mappedBy
属性)。因此,这是Hibernate检查以知道关联必须被删除的一面。

<代码> MaPdBue<代码>不能与<代码> @ OrraseStult<代码>一起使用,因为Hibernate认为这是一个坏的实践,需要一个连接表来代替。请参阅:我试图删除建议的引用,但它没有解决问题。<代码> MaPdBu< <代码>不能与<代码> @ OrthCube 一起使用,因为Hibernate认为这是一个坏的实践,需要一个连接表来代替。请看:我试图按照建议删除引用,但没有解决问题。太好了,黑客帮了我的忙!我的场景是这样的:我从列表中删除了第一个元素,然后将该元素添加到列表的末尾。太好了,这项技术对我有效!我的场景如下:我从列表中删除了第一个元素,然后将该元素附加到列表的末尾。