предотвращение проблемы выбора производительности OpenJPA N + 1 на картах - PullRequest
3 голосов
/ 28 января 2011

Когда у меня есть объект, содержащий карту, например,

@Entity
public class TestEntity {
    @ElementCollection(fetch = FetchType.EAGER)
    Map<String, String> strings = new HashMap<String, String>();
}

, и я выбираю несколько объектов (SELECT z FROM TestEntity z), OpenJPA 2.0 выполняет один запрос для каждого TestEntity для извлечения карты, дажехотя я использовал FetchType.EAGER.Это также происходит, когда значение Map является сущностью, и я использую @OneToMany вместо @ElementCollection.В принципе это можно сделать более эффективно с помощью одного запроса, который выбирает все записи карты для всех возвращаемых объектов TestEntities.Для полей со значениями в коллекции OpenJPA уже делает это по умолчанию (openjpa.jdbc.EagerFetchMode "value =" parallel "), но, по-видимому, происходит сбой на этом простом объекте. (Та же проблема со значением =" join ").

Могу ли я сделать что-то не так? Есть ли простой способ сказать OpenJPA не выполнять запрос для объекта, а только один?* Это проблема для нас, потому что мы хотим получить (и отключить) список из примерно 1900 продуктов, что занимает почти 15 секунд с OpenJPA. Это занимает менее секунды с моим собственным собственным запросом.

Необходимостьнаписать только один собственный запрос не составит особой проблемы, но карта, которую мы используем, находится внутри повторно используемой сущности StringI18N, на которую ссылаются несколько разных сущностей (и может быть глубоко в графе объектов), поэтому собственные запросы являются головной болью при обслуживании.Приветствуется любая помощь в повышении производительности.

РЕДАКТИРОВАТЬ: явное использование JOIN FETCH не помогает either: «SELECT z FROM TestEntity z JOIN FETCH z.strings» TRACE OpenJPA по-прежнему показывает, что он выполняет одну инструкцию SQL для каждого отдельного TestEntity.

1 Ответ

0 голосов
/ 04 апреля 2011

Это может быть боль (исправление: я знаю , это будет боль), но вы пытались на самом деле отобразить ваше 2-поле TestEntity как полное JPA-постоянное @Entity?

Я знаю, что Hibernate раньше относился к @ElementCollection s, например, к @OneToMany s - OpenJPA вполне может делать что-то подобное.

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