Spring Data JPA улучшение байт-кода

#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 в настоящее время не объединяет состояния.