JPA загрузить несколько ленивых коллекций - PullRequest
0 голосов
/ 12 июня 2018

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

@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.

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

1 Ответ

0 голосов
/ 13 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...