2013-05-06 3 views
1

У меня есть объект, который может состоять из себя: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 добавить его?

+0

Выбранный оператор SQL не относится к таблице соединений group_group, которую вы определили для вашего сопоставления OneToMany, используя OrderColumn. По умолчанию он ленив, поэтому попробуйте получить доступ к отношениям групп и покажите SQL, который сгенерирован. Обратите внимание, что упорядочение коллекций происходит только тогда, когда коллекция считывается из БД. Когда объект кэшируется, вы должны поддерживать порядок в приложении или принудительно обновлять родительский объект, чтобы перезагрузка коллекции из БД. – Chris

+0

Это единственный оператор SQL, который появляется в моем журнале. –

ответ

1

Проблема заключалась в том, что я попытался загрузить объекты дочерней группы с помощью CrudRepository. Репозиторий игнорирует аннотацию @OrderColumn. Я исправил его, извлекая родительскую группу и используя getGroups().

0

Пробуйте использовать @OrderBy, который не полагается на базу данных. Вам необходимо будет предоставить поле от Group по заказу (примечание поле не колонка).

@OrderBy("fieldNameGoesHere DESC") 
private List<Group> groups = new ArrayList<Group>(); 

OrderColumn будет поддерживать порядок списка в базе данных, которая несет дополнительную производительность и накладные расходы на техническое обслуживание. OrderBy ставит бремя на поставщика сохранения, чтобы поддерживать порядок сущностей, однако порядок не будет сохраняться в контекстах сохранения.

Для получения дополнительной информации, ознакомьтесь с этим blog post Я создал относительно @OrderBy.

Смежные вопросы