JPA - OrderBy требуется с SortedSet - PullRequest
0 голосов
/ 07 апреля 2020

Почему для отношения SortedSet требуется сортировка аннотаций, таких как hibernate-Speci c @SortNatural или @OrderBy?

Может быть замечательно, если по умолчанию используется естественное упорядочение.

1 Ответ

1 голос
/ 07 апреля 2020

Как определено в главе 2.2 JPA-2.2 ( JSR-338 ):

Постоянные поля и свойства со значением коллекции должны быть определены в терминах одного из следующих коллекционные интерфейсы независимо от того, соответствует ли класс сущности соглашениям о методах JavaBeans, указанным выше, и используется ли доступ к полю или свойству: java .util.Collection , java .util .Set , java .util.List , java .util.Map . Тип реализации коллекции может использоваться приложением для инициализации полей или свойств до того, как объект станет постоянным. Как только объект становится управляемым (или отсоединенным), последующий доступ должен осуществляться через интерфейс типа .

Затем, при извлечении данных в сопоставленное поле @OneToMany, реализация поставщика сохраняемости может использовать любой соответствующий класс реализации для данного поля. Таким образом, если сопоставленная сущность определяет список @OneToMany, поставщик сохраняемости может назначить поле с ArrayList или любой другой конкретной реализацией списка, упорядоченного или нет. Для интерфейсов, не упомянутых, поставщик сохраняемости может принять сопоставление, но это не требуется для соблюдения, и нет никаких гарантий относительно используемой реализации.

Собственная аннотация @SortNatural инструктирует Hibernate использовать упорядоченную реализацию тип коллекции, который будет использовать «естественный компаратор» сущности для упорядочения элементов. Если содержащийся тип сущности реализует интерфейс Comparable, этот компаратор будет «естественным» методом сравнения для упорядочения данной коллекции.

Имейте в виду, что некоторые реализации поставщика сохраняемости могут или не могут повторно использовать экземплярное поле для заполнения коллекции Таким образом, если вы объявили и создали экземпляр поля с заданной упорядоченной реализацией для List или Set, оно может быть уже упорядочено, несмотря на отсутствие использования аннотации hibernate-speci c.

The @OrderBy аннотация, с другой стороны, представляет собой провайдера agnosti c и определяет порядок, который должен соблюдаться в извлеченном списке или наборе, но его реализация ограничена тем, как база данных упорядочит поле. Извлеченная коллекция может использовать любую реализацию, которая сохраняет порядок, в котором данные поступили из базы данных, но не использует интерфейс Comparable для изменения порядка данных после извлечения, как это делает @SortNatural.

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

...