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

Можно ли с готовностью загружать атрибуты @*ToOne с помощью интерфейса JPA (графики сущностей), которые установлены лениво с помощью @LazyToOne , @LazyGroup в родительском классе сущностей и включены улучшения байт-кода? Я пытаюсь загрузить такие атрибуты с нетерпением, используя граф объектов, но он запускает другой запрос для таких атрибутов @*ToOne, когда запрашивается родительский объект.

Попытка иметь другой способ переопределения статического типа выборки в классах сущностей, включая @LazyToOne, который был добавлен с улучшением байт-кода.

Использование Spring 5.1.3, Spring JPA 2.2, Hibernate 5.4.19

Обновление: Data JPA работает, как и ожидалось, и я мог видеть соединения для атрибутов, которые я пытаюсь получить с нетерпением, но эти ленивые атрибуты не инициализируются с ответом на запрос на соединение и гибернацией, вызывая каждый запрос на ссылающиеся атрибуты, которые были аннотированы с помощью @LazyToOneOption .NO_PROXY и уже был загружен с помощью графа сущностей в моем репозитории.

Как я могу избежать этого второго выбора, который даже не требуется, так как я с нетерпением получил эти данные из графа объектов в репозитории JPA?

Любая помощь будет высоко ценится.


person Vanshaj Dixit    schedule 24.10.2020    source источник
comment
Возможно, вы захотите взглянуть на FetchProfile в спящем режиме.   -  person Grim    schedule 26.10.2020
comment
@Grim Пожалуйста, прочтите обновление.   -  person Vanshaj Dixit    schedule 27.10.2020


Ответы (1)


Графики сущностей, как и профили выборки Hibernate, применяются независимо от того, какие аннотации у вас есть в ассоциации. Если это не так, возможно, есть ошибка в Spring Data или, может быть, даже в Hibernate. Вероятно, будет лучше, если вы создадите новую задачу JIRA с тестовый пример воспроизводя проблему.

Сказав это, я думаю, что это идеальный вариант использования для Blaze-Persistence Entity Views. .

Я создал библиотеку, чтобы упростить сопоставление между моделями JPA и пользовательским интерфейсом или моделями, определенными абстрактными классами, что-то вроде Spring Data Projections на стероидах. Идея состоит в том, что вы определяете свою целевую структуру (модель домена) так, как вам нравится, и сопоставляете атрибуты (геттеры) с помощью выражений JPQL с моделью объекта.

Пример модели DTO с Blaze-Persistence Entity-Views может выглядеть следующим образом:

@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 Data позволяет использовать его почти как Spring Data Projections: https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

person Christian Beikov    schedule 26.10.2020
comment
Не уверен, какова ваша настройка, но если сущность уже связана с диспетчером сущностей в качестве прокси, присоединяйтесь к ее извлечению или используйте для нее граф сущности, это не поможет вам, так как Hibernate в настоящее время не объединяет состояния. - person Christian Beikov; 31.10.2020