У меня есть объект, который может состоять из себя:OneToMany + JoinTable + OrderColumn: Заказ написано правильно, но не прочитанных
class Group {
// ...
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(
name = "group_group",
joinColumns = @JoinColumn(name = "id"),
inverseJoinColumns = @JoinColumn(name = "parentgroup_id")
)
@OrderColumn
private List<Group> groups = new ArrayList<Group>();
@ManyToOne
private Group parentGroup;
public List<Group> getGroups() {
return groups;
}
public Group getGroup() {
return parentGroup;
}
}
Я могу создать группу и добавить две дочерние группы:
Group parent = new Group();
Group child1 = new Group();
Group child2 = new Group();
parent.getGroups().add(child1);
parent.getGroups().add(child2);
parent = groupRepository.save(parent);
// parent.getGroups().get(0).getId() == child1.getId()
// parent.getGroups().get(1).getId() == child2.getId()
Но это похоже на совпадение. Я могу обновить заказ (например, с помощью Collections.sort), и строки таблицы соединений обновляются правильно.
Не имеет значения, как я загружаю родительскую группу, дочерние группы всегда находятся в порядке создания. Выполненный SQL-запрос:
SELECT t1.ID, t1.PARENTGROUP_ID FROM GROUP t0, GROUP t1 WHERE ((t1.PARENTGROUP_ID = ?) AND (t0.ID = t1.PARENTGROUP_ID))
Нет ORDER BY, который кажется неправильным. Как я могу убедить EclipseLink добавить его?
Выбранный оператор SQL не относится к таблице соединений group_group, которую вы определили для вашего сопоставления OneToMany, используя OrderColumn. По умолчанию он ленив, поэтому попробуйте получить доступ к отношениям групп и покажите SQL, который сгенерирован. Обратите внимание, что упорядочение коллекций происходит только тогда, когда коллекция считывается из БД. Когда объект кэшируется, вы должны поддерживать порядок в приложении или принудительно обновлять родительский объект, чтобы перезагрузка коллекции из БД. – Chris
Это единственный оператор SQL, который появляется в моем журнале. –