У меня есть следующие сущности:
@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 по умолчанию.
Как вы это делаете правильно?




В идеале @OneToMany по умолчанию должен иметь ленивые загружаемые ассоциации. Следовательно, в классе FlowEntity шаги должны выбираться лениво. Кроме того, как показано в ответе, вы можете использовать JPQL Join FETCH для быстрой загрузки необходимых ассоциаций.
Вы можете использовать граф сущностей (мысли-on-java.org/jpa-21-entity-graph-part-2-define) или соединения выборки JPQL (objectdb.com/java/jpa/query/jpql/…)