Как получить сортируемый набор в гибернации

#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());
  

Реализуйте свой собственный компаратор и используйте его для отсортированных наборов.