#java #hibernate
#java #впасть в спящий режим #спящий режим
Вопрос:
Обычно мы используем наборы для коллекций «от одного ко многим» и «от многих ко многим» в режиме гибернации. До сих пор это работало нормально.
Но теперь нам нужно все больше и больше выполнять сортировку дочерних коллекций в памяти на уровне контроллера, потому что разные представления должны видеть дочерние коллекции в разных порядках. Мы не можем просто указать порядок в объявлении объекта, который работает для всех наших представлений.
Наша проблема заключается в том, что вы не можете собирать коллекции.сортируйте набор, и мы боимся обернуть наш набор в список, потому что это может нарушить нашу привязку (особенно в родительском дочернем отношении).
Итак, мы подумываем о том, чтобы изменить весь наш набор на список в сущностях (без индексного столбца), но это кажется крайним, и я читал о проблемах с двунаправленными отношениями один ко многим и многие ко многим.
Есть какие-нибудь предложения?
Комментарии:
1. Не зная, что вы подразумеваете под «это может нарушить нашу привязку», трудно ответить. Я бы не стал изменять сущности, за исключением, возможно, добавления метода getFoosAsList, который возвращал бы список, созданный из постоянного набора Foo.
Ответ №1:
Вы можете позволить своим объектам set реализовать сопоставимый интерфейс<> .
Таким образом, используя функцию compareTo (которую вы должны реализовать), вы можете указать порядок для своих наборов.
Режим гибернации, инициализирующий набор, будет использовать порядок, указанный в функции compareTo.
Ответ №2:
В Google Collections есть ImmutableSortedSet, возможно, это может помочь.
Ответ №3:
Вы можете определить формулу (также в критериях) или SortedSet и реализовать comparator
. В определении набора вы также можете (в 3.3) определить order-by
элемент (SQL).
Пример:
Formula: Made in DBMS for a particular relation.
<many-to-one name="homeAddress" class="Address" insert="false" update="false">
<column name="person_id" not-null="true" length="10"/>
<formula>'ORDER BY LENGTH(homeAddress)'</formula>
</many-to-one>
Formula in Criteria: Made in DBMS.
sortedUsers = s.createFilter( group.getUsers(), "order by this.name" ).list();
Sorted: Made in Java and application wide for a particular relation.
<map name="holidays" sort="my.custom.HolidayComparator">
<key column="year_id"/>
<map-key column="hol_name" type="string"/>
<element column="hol_date" type="date"/>
</map>
Order-by clause: Made in DBMS and application wide for a particular relation.
<set name="aliases" table="person_aliases" order-by="lower(name) asc">
<key column="person"/>
<element column="name" type="string"/>
</set>
Ответ №4:
Я думаю, что сортированный набор может вам помочь. Например:
@OneToMany()
@Sort(comparator = SomeComparator.class, type = SortType.COMPARATOR)
private SortedSet<Item> items= new TreeSet<Item>(SomeComparator.instance());
Реализуйте свой собственный компаратор и используйте его для отсортированных наборов.