Будет ли доступ к элементу в списке, аннотированном @LazyCollection (LazyCollectionOption.EXTRA), вызвать инициализацию всего списка? - PullRequest
1 голос
/ 10 апреля 2020

У меня есть следующий класс чата:

@Data
@Entity
@NoArgsConstructor
public class Chat extends BaseEntity {

    @ManyToOne
    @JoinColumn(name = "user1_id")
    private User user1;

    @ManyToOne
    @JoinColumn(name = "user2_id")
    private User user2;

    @LazyCollection(LazyCollectionOption.EXTRA)
    @OrderBy("sentAt DESC")
    @OneToMany(mappedBy = "chat", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<Message> messages = new ArrayList<>();

    public Chat(User user1, User user2) {
        this.user1 = user1;
        this.user2 = user2;
    }
}

В отношении поля messages меня интересует только доступ к первому элементу, который является последним сообщением в этом случае -

Будет ли выполнение следующего оператора: chat.getMessages().get(0) причиной инициализации всего списка messages? Если да, то какова лучшая практика?

1 Ответ

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

Это не будет работать таким образом.

В соответствии с документацией hibernate :

LazyCollectionOption.EXTRA работает только для упорядоченных коллекций, либо List ( s) с пометками @OrderColumn или Map (s).

Для сумок (например, обычных списков объектов, которые не сохраняют какой-либо определенный порядок), @LazyCollection(LazyCollectionOption.EXTRA) ведет себя как любой другой FetchType.LAZY collection (коллекция извлекается полностью при первом обращении к ней).

С другой стороны, согласно документации для аннотации @ OrderColumn :

Аннотация OrderBy должна использоваться для упорядочения, которое отображается как постоянное состояние и поддерживается приложением. Аннотация OrderBy не используется, если указано OrderColumn.

Столбец заказа должен быть целочисленного типа. Поставщик сохраняемости поддерживает непрерывный (не -parse) упорядочение значений столбца порядка при обновлении ассоциации или коллекции элементов. Значение столбца заказа для первого элемента равно 0.

Таким образом, вы не можете использовать аннотацию @OrderColumn для упорядочения по дате / времени и, как результат, LazyCollectionOption.EXTRA для первого элемента с отложенной загрузкой. .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...