Допустим, у меня есть этот класс в моем приложении 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, но я хочу, чтобы эти дочерние объекты присуждались.




Жаждущий Загрузка — это шаблон проектирования, в котором инициализация данных происходит на месте.
Ленивый Загрузка — это шаблон проектирования, который используется для отсрочки инициализации объекта до тех пор, пока это возможно.
когда включена ленивая загрузка, если мы подтянем Person, данные Award не будут инициализированы и загружены в память до тех пор, пока к ним не будет сделан явный вызов.
В стратегии нетерпеливой загрузки, если мы загрузим Person, он также загрузит все награды, связанные с ним, и сохранит их в памяти.
Так что просто используйте fetch=FetchType.Eager
@OneToMany(fetch=FetchType.Eager, mappedBy = "person", cascade = {CascadeType.ALL})
private List<Award> awards;
что делать, если у меня есть несколько нетерпеливых загрузок? Потому что в этом случае я получаю MultipleBagFetchException: невозможно одновременно получить несколько сумок