#spring #hibernate #jpa #entitygraph #byte-code-enhancement
#spring #переход в спящий режим #jpa #entitygraph #улучшение байт-кода
Вопрос:
Можно ли быстро загружать атрибуты @ *ToOne, используя интерфейс JPA (Entity Graphs), которые устанавливаются отложенными с использованием @LazyToOne , @LazyGroup в родительском классе сущностей и с включенным улучшением байт-кода? Я пытаюсь быстро загрузить такие атрибуты, используя entity graph, но он запускает другой запрос для таких атрибутов @ * ToOne при запросе родительского объекта.
Пытаюсь найти другой способ переопределить статический тип выборки в классах сущностей, включая @LazyToOne, который был добавлен с улучшением байт-кода.
Использование Spring 5.1.3, Spring JPA 2.2, гибернация 5.4.19
Обновление: Data JPA работает как ожидалось, и я мог видеть объединения для атрибутов, которые я с нетерпением пытаюсь получить, но эти отложенные атрибуты не инициализируются с помощью ответа на запрос соединения, и переход в спящий режим вызывает каждый запрос на ссылки на атрибуты, которые были аннотированы с помощью @LazyToOneOption.NO_PROXY и уже были извлечены с помощью entity graphв моем репозитории.
Как я могу избежать этого второго выбора, который даже не требуется, поскольку я с нетерпением получил эти данные из entity graph в JPA respository??
Любая помощь будет высоко оценена.
Комментарии:
1. Возможно, вам захочется взглянуть на FetchProfile hibernate.
2. @Grim Пожалуйста, ознакомьтесь с обновлением.
Ответ №1:
Графики сущностей, как и профили выборки в режиме гибернации, применяются независимо от того, какие аннотации у вас есть в ассоциации. Если этого не происходит, возможно, в Spring Data есть ошибка или, возможно, даже спящий режим. Вероятно, будет лучше, если вы создадите новую проблему JIRA с тестовым примером, воспроизводящим проблему.
Сказав это, я думаю, что это идеальный вариант использования для представлений сущностей с сохранением Блейза.
Я создал библиотеку, позволяющую легко сопоставлять модели JPA с моделями, определяемыми пользовательским интерфейсом или абстрактным классом, что-то вроде весенних прогнозов данных на стероидах. Идея заключается в том, что вы определяете свою целевую структуру (модель домена) так, как вам нравится, и сопоставляете атрибуты (геттеры) с помощью выражений JPQL с моделью сущности.
Пример модели DTO может выглядеть следующим образом с помощью представлений объектов Blaze-Persistence:
@EntityView(User.class)
public interface UserDto {
@IdMapping
Long getId();
String getName();
Set<RoleDto> getRoles();
@EntityView(Role.class)
interface RoleDto {
@IdMapping
Long getId();
String getName();
}
// Other mappings
}
Запрос — это вопрос применения представления сущности к запросу, простейшим из которых является просто запрос по идентификатору.
UserDto a = entityViewManager.find(entityManager, UserDto.class, id);
Интеграция данных Spring позволяет использовать его почти как проекции данных Spring: https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features
Комментарии:
1. Не уверен, какова ваша настройка, но если объект уже связан с entity manager в качестве прокси, присоединитесь к его извлечению или используйте для него entity graph, поскольку Hibernate в настоящее время не объединяет состояния.