Как получить значение Null для дочернего элемента в OneToMany в Spring Boot JPA

Мне нужно получить простой список родительских объектов с нулевыми значениями для дочерних элементов. Но когда я использую метод findAll(), а затем пытаюсь получить дочерний объект, я получаю LazyInitializationException: не удалось лениво инициализировать набор ролей: ... не удалось инициализировать прокси - нет сеанса. Я вижу объяснение этой проблемы (о Lazy/Eager, JOIN FETCH), но мне нужно получить значение null для дочерних объектов без запроса для дочерних объектов.

@Entity
public class Parent {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "parent")
    Set<Child> childs;

@Entity
public class Child {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    Parent parent;

@Service
    public class ParentService {

    @Autowired
    ParentRepository parentRepository;

    public List<Course> getParentList() {
        return parentRepository.findAll();
    }

В спящем режиме я получаю правильный запрос:

select parent0_.id as id1_0_ from parent parent0_

Перед тестом я добавляю несколько родительских сущностей в БД, результат не пустой, и в этом тесте я получаю ошибку LazyInitializationException

@Test
    public void checkParentListFormat() {
        List<Parent> parentList = parentService.getParentList();
        Assertions.assertThat(parentList.get(0).getChilds()).isNull();
    }


Я читал о DTO, но можно ли получить простую сущность с нулевыми значениями? Спасибо


person Pavel Verhoturov    schedule 28.09.2020    source источник


Ответы (1)


Я думаю, вам нужно поместить свою ленивую инициализацию в родительскую аннотацию.

@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
Set<Child> childs;
person hitch.united    schedule 28.09.2020
comment
Да, я пробовал это, но ситуация не меняется. Для oneToMany тип выборки по умолчанию — Lazy, и при установке Lazy напрямую ничего не меняется. Я вижу похожие вопросы, и кажется, что если у объекта есть дочерние элементы, их невозможно получить без другого объекта (DTO). Например, мне нужен объект ParentDTO только с полем parentId. В этом случае я получу то, что мне нужно. - person Pavel Verhoturov; 29.09.2020
comment
Итак, мне нужно получить все дочерние элементы или создать другой объект (DTO) с полями, которые мне нужны, и получить этот объект. Если кто-нибудь знает, как остановить спящий режим, попробуйте получить дочерний элемент в выбранном запросе, это будет здорово. Пока я буду использовать DTO. - person Pavel Verhoturov; 29.09.2020