Ваша двунаправленная связь отображается дважды: один раз в 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 проверяет, чтобы знать, что связь должна быть удалена.