Какой лучший способ заказать коллекции в Hibernate?
У меня есть список значений для класса в Hibernate. Моей первоначальной реализацией был Set, но он возвращает значения в том, что по сути является "порядком базы данных" (вероятно, на основе кластерного индекса, который является почти порядком вставки).
Я посмотрел на переключение на List, поэтому добавил, но быстро столкнулся с проблемой отсутствия значений в списках Java, которые возвращались. Некоторые из моих данных написаны Hibernate, но некоторые из них также написаны сценариями SQL.
То, что я хотел бы, это атрибут sortOrder, который не привязан к позиции в списке, так что если есть дубликаты, т.е. { 1, 3, 3, 10 }, он соответствующим образом отображается в { 0, 1, 2, 3} где порядок 2-го и 3-го элемента возвращается к порядку в базе данных. Нули также хороши, и мне все равно, будут ли они помещены в начале или в конце списка (при условии, что поведение является последовательным).
Я посмотрел на Bag, но я не был уверен, как включить атрибут sortOrder в определение, и меня немного беспокоило, что он допускает дублирование. Я все еще хотел бы иметь те же ограничения, что и при использовании Set (я считаю, что кортеж родитель / потомок всегда был уникальным).
Предложения? Могу ли я настроить Bag, чтобы он действовал как список с помощью sortOrder, а не как список с индексом? Что еще мне нужно сделать, чтобы защитить код от зависания от данных, введенных непосредственно SQL?
2 ответа
У меня была такая же проблема в проекте, над которым я работал. Последнее, что я мог сделать, это использование триггера базы данных, чтобы сохранить эти позиционные данные в правильном порядке. Триггер берет записи в списке, ранжирует их в правильном и обновляет положение.
Я не думаю, что у вас будут другие варианты, так как вы изменяете данные с помощью sql, а также hibernate.
Если вы используете спящие аннотации, вы можете использовать javax.persistence.OrderBy
чтобы упорядочить элементы "в памяти" по указанному свойству без введения столбца индекса, см.:
http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/