#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-запрос, извлекающий связанный объект.