jpa: нетерпеливая и отложенная загрузка в дочернем объекте

#java #jpa #lazy-loading #eager-loading

#java #jpa #отложенная загрузка #нетерпеливая загрузка

Вопрос:

У меня есть 2 класса

Student.java

 public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int student_id;
private String student_name;
@OneToMany(mappedBy ="student", cascade = CascadeType.ALL,fetch=FetchType.LAZY )
private List<Book> books;

//the getters and setters
}
  

Book.java

  public class Book
    { @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private int book_id;
      private String book_name;
      @ManyToOne(fetch=FetchType.LAZY)
      private Student student;
    
    //the getters and setters
    }
  

Я знаю, что разница между быстрой загрузкой и отложенной загрузкой заключается в том, что быстрая загрузка помогает вам загружать все необходимые объекты одновременно, но отложенная загрузка загружает их при необходимости. Итак, для моего класса Student, и поскольку я использую ОТЛОЖЕННУЮ загрузку, он загружает student_id, student_name, но не загружает список книг, пока я не вызову методы getBooks() . Это ясно для родительской сущности.
Но для дочерней сущности это немного сбивает с толку. В чем разница между использованием нетерпеливой загрузки и отложенной загрузки внутри книги классов (в отношениях @ManyToOne)

Комментарии:

1. Ваш вопрос неясен. В объекте Book это будет действовать так же, объект student будет загружен с задержкой.

2. итак, почему большинство людей используют lazy для родительского класса и eager для дочернего?

3. Вы находитесь в родительском классе, поскольку у него есть список. Это должно загружать много данных из базы данных. Они, в свою очередь, могут иметь отношения с другими классами, заставляя его загружать все, что не нужно. Где, как и в дочернем классе, который в вашем случае является a @ManyToOne , является всего лишь одним объектом. Вот почему тип выборки по умолчанию @ManyToOne — нетерпеливый.