Когда у меня есть объект, содержащий карту, например,
@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.