JsonMappingException: не удалось лениво инициализировать набор ролей

Допустим, у меня есть этот класс в моем приложении Java, spring boot, hibernate:

@Entity
@Table(name = "person")
@Getter @Setter @NoArgsConstructor
public class Person{

    @Id
    @Column(name = "ID", nullable=false)
    private int Id;

    @Column(name = "PERSON_ID")
    private String personId;

    @Column(name = "FIRST_NME")
    private String firstName;

    @Column(name = "LAST_NME")
    private String lastName;

    @OneToMany(fetch=FetchType.LAZY, mappedBy = "person", cascade = {CascadeType.ALL})
    private List<Award> awards;
}

и скажем, что это класс наград:

@Entity
@Table(name = "award")
@Getter @Setter @NoArgsConstructor
public class Award{

    @Id
    @Column(name = "COMPOSITE_ID", nullable=false)
    private int Id;

    @Column(name = "AWARD_CODE")
    private String awardCode;

    @Column(name = "AWARD_NAME")
    private String awardName;

    @ManyToOne
    @JoinColumn(name = "PERSON_ID")
    private Personn person;
}

Когда я просто нахожу все из моего репозитория jpa следующим образом:

List<Person> findAll();

Я получаю эту ошибку:

failed to lazily initialize a collection of role: com.my.proj.datastores.legacy.model.Person.awards, could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.my.proj.datastores.legacy.model.Person.awards, could not initialize proxy - no Session (through reference chain: com.my.proj.datastores.ngl.model.Person["awards"])]

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

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

Ответы 1

Ответ принят как подходящий

Жаждущий Загрузка — это шаблон проектирования, в котором инициализация данных происходит на месте.

Ленивый Загрузка — это шаблон проектирования, который используется для отсрочки инициализации объекта до тех пор, пока это возможно.

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

В стратегии нетерпеливой загрузки, если мы загрузим Person, он также загрузит все награды, связанные с ним, и сохранит их в памяти.

Так что просто используйте fetch=FetchType.Eager

@OneToMany(fetch=FetchType.Eager, mappedBy = "person", cascade = {CascadeType.ALL})
private List<Award> awards;

что делать, если у меня есть несколько нетерпеливых загрузок? Потому что в этом случае я получаю MultipleBagFetchException: невозможно одновременно получить несколько сумок

Numan Karaaslan 08.12.2021 20:15

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