Отложенная загрузка не работает для отношений OneToMany при загрузке Spring

#spring #hibernate #spring-mvc #spring-boot #spring-data-jpa

#spring #спящий режим #spring-mvc #весенняя загрузка #spring-data-jpa

Вопрос:

Я работал с данными весенней загрузки jpa spring mysql thymeleaf и столкнулся с проблемой. Это @OneToMany (fetch = FetchType.LAZY) отношение для списка, список загружается в спящий режим, как @OneToMany (fetch = FetchType.EAGER) снаружи. Но если я использую аннотацию @ManyToOne , это работает отлично.

Есть идеи, почему это происходит таким образом? Кстати, я хочу сохранить свойство spring.jpa.open-in-view = true . Я отлаживаю приложение Author — Book ( One to Many ), разработанное IntelliJ IDEA в.

Вот класс Book .

 @Entity
public class Book implements Serializable {
   @Id
   @GeneratedValue
   private Integer id;

   @NotNull
   private String name;

   @NotNull
   @JoinColumn(name = "author_id")
   @ManyToOne(fetch = FetchType.LAZY)
   private Author author;

  /* getters and setters */
}
  

Здесь автор класса

 @Entity
public class Author implements Serializable {
   @Id
   @GeneratedValue
   private Integer id;

   @NotNull
   private String name;

   @OneToMany(mappedBy = "author", fetch = FetchType.LAZY)
   private List<Book> bookList;

   /* getters and setteres */
}
  

Контроллер для отладки.

 @Controller
@RequestMapping("/")
public class HomeController {

    @Autowired
    private AuthorRepository authorRepository;

    @Autowired
    private BookRepository bookRepository;

    @GetMapping
    private ModelAndView index() {
        List<Author> authorList = authorRepository.findAll();
        return new ModelAndView("home"); // first breakpoint
    }

    @GetMapping("/books")
    private ModelAndView viewBooks() {
        List<Book> bookList = bookRepository.findAll();
        return new ModelAndView("books"); // second breakpoint
    }

}
  

Вот результат.

Первый результат точки останова Первый результат точки останова

Результат второй точки останова Результат второй точки останова

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

1. тип отложенной выборки выполнит выборку, как только вы попытаетесь получить доступ к объекту. где ваш код, который используется для загрузки / получения объектов? вы можете опубликовать это?

2. Я только отлаживаю с помощью Intellij IDEA debug. Результат первой точки останова не должен загружать список книг. В этом случае размер списка книг должен быть равен 0. Первый результат точки останова находится здесь. ссылка .

3. Я буду признателен, если вы опубликуете свой код, tnx.

4. Да, извините. Это мой код на GitHub github.com/DarwinGalindo/lazy-my-app-problem

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

Ответ №1:

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

Я считаю, что когда вы используете отладочные представления, чтобы определить, что внутри, вы фактически выполняете выборку.

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

1. Я должен согласиться. Если я запускаю свою программу в стандартном режиме, связанная сущность с отложенной загрузкой никогда не извлекается из базы данных. Если я запускаю его в режиме отладки, я вижу SQL-запрос, извлекающий связанный объект.