2012-06-22 4 views
0

У меня есть список под-значений для класса в Hibernate. Моя первоначальная реализация была Set, но она возвращает значения в том, что по сути является «порядком базы данных» (вероятно, на основе кластерного индекса, который является почти порядком размещения).Каков наилучший способ заказа коллекций в Hibernate?

Я посмотрел на переключение на список, поэтому я добавил a, но я быстро столкнулся с проблемой, когда в возвращаемых java-списках были возвращены нули. Некоторые из моих данных написаны Hibernate, но некоторые из них также написаны сценариями SQL.

Что мне нужно, это атрибут sortOrder, который не привязан к позиции в списке, так что если есть дублированный то есть {1, 3, 3, 10}, он соответствующим образом отображается на {0, 1 , 2, 3}, где порядок 2-го и 3-го пунктов возвращается к порядку базы данных. Нулеки также прекрасны, и мне все равно, попадают ли они на передний или задний список (пока поведение несовместимо).

Я посмотрел на Сумку, но я не был уверен, как получить атрибут sortOrder в определении, и я был немного обеспокоен тем, что он допускает дубликаты. Мне все же хотелось бы иметь те же ограничения, что и я, когда у меня был Set (я считаю, что родительский/дочерний кортеж всегда был уникальным).

Предложения? Могу ли я настроить пакет, чтобы заставить его действовать как List с sortOrder, а не List с индексом? Что еще мне нужно сделать, чтобы защитить код от зависания данных, введенных непосредственно SQL?

ответ

1

У меня была такая же проблема, как и в проекте, над которым я работал. Конечная идея, с которой я мог справиться, заключалась в использовании триггера базы данных, чтобы сохранить эти позиционные данные в правильном порядке. Триггер принимает записи в списке и оценивает их в правильном порядке и обновляет позицию.

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

+0

Есть состояние гонки между время видимости строк и время обновления триггера? После создания схемы, я думаю, вы используете SQL для добавления триггера? –

+0

Я использовал сервер sql, и триггер был частью процесса trasaction, поэтому не будет проблем с синхронизацией. Триггер был вызван в sql и был просто добавлен как триггер обновления в таблице, который был isssue. Этот способ очень чист и останавливает все нули от попадания в вашу позицию colum. –

+0

Я обязательно это рассмотрю, но до сих пор я агностик базы данных, поэтому я бы предпочел найти 100% -ное решение Hibernate. Вы вообще играли с Bags? –

0

Если вы используете Hibernate аннотации, вы можете использовать javax.persistence.OrderBy заказать элементы «в памяти» с помощью указанного свойства без введения столбца индекса, см:

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-hibspec-collection

+0

Я не использовал аннотации, у меня просто есть hbm-файл с выложенной схемой. Я видел механику orderBy, но я предпочел бы сохранить большую часть сортировки в базе данных, поскольку для многих из моих реализаций это на самом деле большая отдельная коробка с большей мощностью, чем поле приложения. –

+0

Кроме того, мне бы очень понравился столбец sortOrder, потому что я не заказываю данные, а скорее пользовательский порядок данных (что, несомненно, несколько иррационально :-) –