JsonMappingException: не удалось лениво инициализировать коллекцию ролей - PullRequest
1 голос
/ 15 марта 2019

Допустим, у меня есть этот класс в моем приложении Java, с весенней загрузкой, в спящем режиме:

@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, но я хочу, чтобы эти наградные дочерние объекты.

1 Ответ

1 голос
/ 15 марта 2019

Стремление Загрузка - это шаблон проектирования, в котором инициализация данных происходит на месте

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

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

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

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

@OneToMany(fetch=FetchType.Eager, mappedBy = "person", cascade = {CascadeType.ALL})
private List<Award> awards;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...