Использование FetchMode.SELECT с FetchType.EAGER в Hibernate ⇐ JAVA
-
Гость
Использование FetchMode.SELECT с FetchType.EAGER в Hibernate
У меня есть две сущности: страница и комментарий
страница общедоступного класса{ частный внутренний идентификатор; частные комментарии List = new ArrayList(); @OneToMany(mappedBy = "страница") public List getComments() {возврат комментариев} } общественный класс Комментарий { частный внутренний идентификатор; частная строка msgText; личная страница Страницы; @ManyToOne @JoinColumn(name="page_id") общедоступная страница getPage() { возвратная страница } } На странице хранится коллекция комментариев. Каждый раз, когда я получаю страницу, я хочу, чтобы все комментарии загружались вместе с ней, поэтому мне нужно использовать FetchType.EAGER. По умолчанию используется FetchMode.JOIN
Проблема в том, что JOIN портит нумерацию страниц - когда я устанавливаю ограничение на 5, я получаю первое сообщение, а также 4 комментария (или 5 комментариев, я забыл). Вместо этого я должен получить первые 5 сообщений, а также все их комментарии.
Поэтому вместо этого я решил использовать FetchMode.SELECT.
Мои вопросы:
[*]Какова разница в производительности между FetchMode.SELECT вместе с FetchType.EAGER и FetchMode.JOIN? [*]Я знаю, что FetchType.LAZY может привести к проблеме с запросами N+1, если я последовательно вызываю getComments() для коллекции сущностей Page. Возникает ли эта проблема при использовании FetchMode.SELECT с FetchType.EAGER? (т. е. когда я загружаю коллекцию страниц, сколько запросов она будет сделать, чтобы немедленно загрузить все связанные с ними комментарии?) [*]Есть ли смысл использовать размер пакета с FetchMode.SELECT и FetchType.EAGER?
У меня есть две сущности: страница и комментарий
страница общедоступного класса{ частный внутренний идентификатор; частные комментарии List = new ArrayList(); @OneToMany(mappedBy = "страница") public List getComments() {возврат комментариев} } общественный класс Комментарий { частный внутренний идентификатор; частная строка msgText; личная страница Страницы; @ManyToOne @JoinColumn(name="page_id") общедоступная страница getPage() { возвратная страница } } На странице хранится коллекция комментариев. Каждый раз, когда я получаю страницу, я хочу, чтобы все комментарии загружались вместе с ней, поэтому мне нужно использовать FetchType.EAGER. По умолчанию используется FetchMode.JOIN
Проблема в том, что JOIN портит нумерацию страниц - когда я устанавливаю ограничение на 5, я получаю первое сообщение, а также 4 комментария (или 5 комментариев, я забыл). Вместо этого я должен получить первые 5 сообщений, а также все их комментарии.
Поэтому вместо этого я решил использовать FetchMode.SELECT.
Мои вопросы:
[*]Какова разница в производительности между FetchMode.SELECT вместе с FetchType.EAGER и FetchMode.JOIN? [*]Я знаю, что FetchType.LAZY может привести к проблеме с запросами N+1, если я последовательно вызываю getComments() для коллекции сущностей Page. Возникает ли эта проблема при использовании FetchMode.SELECT с FetchType.EAGER? (т. е. когда я загружаю коллекцию страниц, сколько запросов она будет сделать, чтобы немедленно загрузить все связанные с ними комментарии?) [*]Есть ли смысл использовать размер пакета с FetchMode.SELECT и FetchType.EAGER?
Мобильная версия