JPA загружает несколько ленивых коллекций

У меня есть следующие сущности:

@Entity
public class ProjectEntity implements Project {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(targetEntity =  FlowEntity.class)
    private Flow flow;
}

@Entity
public class FlowEntity implements Flow {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @OneToMany(targetEntity = StepEntity.class, fetch = FetchType.EAGER)
    private List<Step> steps;
}

@Entity
public class StepEntity implements Step {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(targetEntity = ResourceEntity.class, fetch = FetchType.LAZY)
    private List<Resource> resources;

    @OneToMany(targetEntity = StepRuleEntity.class, fetch = FetchType.LAZY)
    private List<StepRule> rules;

    @ManyToMany(targetEntity = ResourceTypeDataEntity.class, fetch = FetchType.LAZY)
    private List<ResourceTypeData> resourceTypeData;
}

Теперь, когда я получаю свой проект, я хочу, чтобы все было загружено. Я не могу заставить все загружаться, потому что это просто все замедлит. Но для этой функциональности мне сейчас действительно нужно все из проекта.

Я читал в Интернете, что вам нужно вызывать метод .size() для каждой коллекции, и что jpa затем загрузит коллекции, но это не работает. Кроме того, мне очень странно, что мне нужно выполнять цикл for в моем дао на каждом этапе потока для загрузки следующих лениво загружаемых коллекций.

Мой метод помечен @Transactional для получения проекта, и это JpaRepostitory по умолчанию.

Как вы это делаете правильно?

Вы можете использовать граф сущностей (мысли-on-java.org/jpa-21-entity-graph-part-2-define) или соединения выборки JPQL (objectdb.com/java/jpa/query/jpql/…)

Michal 12.06.2018 15:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
1 009
1

Ответы 1

В идеале @OneToMany по умолчанию должен иметь ленивые загружаемые ассоциации. Следовательно, в классе FlowEntity шаги должны выбираться лениво. Кроме того, как показано в ответе, вы можете использовать JPQL Join FETCH для быстрой загрузки необходимых ассоциаций.

Другие вопросы по теме