Hibernate: @OrderBy против @OrderColumn для поддержания порядка коллекции

Каков предпочтительный способ поддержания порядка коллекции при сохранении, а также при извлечении из базы данных?

Я знаю, что @OrderBy - это скорее сортировка в памяти, которая может работать при извлечении только тогда, когда вы расположите строки в порядке столбца, который вы выбрали.

Допустим, я выбрал использование столбца, подкрепленного последовательностью базы данных, и в спящем режиме убедится, что элементы в коллекции сохраняются в том же порядке, что и в коллекции (скажем, List).

Есть мысли?

More details:

Допустим, у меня есть класс A, который имеет отношение один-ко-многим с классом B. B имеет поле первичного ключа, & # x2018; Id & # x2019 ;, которое поддерживается последовательностью в DB.

Class A {
  List<B> bList;
}

Я всегда хотел сохранить порядок элементов B в A, как показано ниже:

bList = { b1, b2, b3 }

Одним из способов добиться этого является использование @OrderBy (& # x201C; Id ASC & # x201D;). Это будет работать только в том случае, если список B сохраняется в следующем порядке:

----------------
Id ----bValue
----------------

1------ b1
2------ b2
3-------b3
------------------

Когда мы получаем, так как он упорядочен по Id, порядок сохраняется.

Предположим, что коллекция B сохраняется следующим образом:

----------------
Id ----bValue
----------------
1------ b2
2------ b1
3-------b3
------------------

Когда мы получаем, порядок списка B идет для броска (так как это порядок по столбцу Id). Поэтому мой вопрос, сохраняется ли коллекция B всегда в том же порядке, в котором она отображается в списке, или нет.

Ответы на вопрос(1)

чтобы упорядочить членов полученной коллекции по столбцу таблицы целевого объекта:

@OrderBy("lastname ASC")
public List<Student> students;

сгенерирует запрос SQL как

select ... order by student.lastname ASC

OrderColumn определяет имя дополнительного столбца в таблице, содержащейindex сущности в списке. Если вы измените порядок элементов в списке, Hibernate изменит значение этого столбца. И если ваши ученики имеют значения 0, 3 и 5 в этом столбце, список будет

[student0, null, null, student3, null, student5]

Это хорошо описано вJavadoc из этих 2 аннотаций.

РЕДАКТИРОВАТЬ:

Порядок, в котором присваиваются идентификаторы B, зависит от того, как вы сохраните эти экземпляры B:

if you explicitely call session.save(), of session.saveOrUpdate(), this assigns an ID to the entity, so calling it for b1, b2 and b3 will respect the order AFAIK, all the other methods (cascading, merge(), persist()) don't guarantee any order (except if you merge or persist, and then flush())

Поэтому, если вы хотите, чтобы список содержал b1, b2 и b3 в этом порядке, независимо от того, как они сохраняются, лучше всего добавить@OrderColumn аннотация к коллекции. Hibernate автоматически заполнит этот столбец 0 для b1, 1 для b2 и 2 для b3. И когда вы перезагрузите родительский объект, они будут в том же порядке в списке.

 11 июл. 2012 г., 17:24
Я обновил свой ответ.
 11 июл. 2012 г., 16:15
Ваш вопрос не имеет большого смысла. Если вы используете OrderBy и меняете фамилию учеников в списке, то при следующей загрузке учеников список будет отсортирован по новым значениям фамилии. Если вы используете OrderColumn, Hibernate будет использовать индекс элементов в списке для заполнения столбца заказа. Таким образом, строка сущности с индексом 0 будет заполнена значением 0. Порядок, в котором выполняются запросы вставки / обновления, совершенно не имеет значения.
 Phani Kumar11 июл. 2012 г., 16:58
Не уверен, что вы понимаете вопрос, я добавил больше деталей к вопросу.
 Phani Kumar11 июл. 2012 г., 16:05
Да, я уже осознаю цель каждой из этих аннотаций. Мой конкретный вопрос касается сохранения порядка в коллекции, так как в какой-то момент мы можем использовать оба из них. Также любая идея о моем вопросе о порядке, который спящий список сохраняется.

Ваш ответ на вопрос