[英]Why does Spring MVC controller method ignore FetchType.LAZY behaviour and act like FetchType.EAGER?
我的電影model明確聲明它應該懶惰地獲取其子 Actors 。
@Entity
@Getter
@Setter
public class Film {
...
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "film_actor",
joinColumns = @JoinColumn(name = "film_id"),
inverseJoinColumns = @JoinColumn(name = "actor_id")
)
private List<Actor> cast = new ArrayList<>();
在任何其他上下文中使用服務/存儲庫時,這實際上非常有效:
@Override
public void run(String... args) throws Exception {
List<Film> films = filmService.getAllFilms();
System.out.println(films);
}
但隨后出於某種神秘的原因,僅當在 Spring MVC controller 方法中使用時(使用 @Controller 和 @RequestMapping 等典型注釋),它總是會急切地加載...為什么以及如何更改它? 如果我想一次放映 1000 部電影,我不想加載一百萬演員!
@GetMapping("")
public String filmsPage(Model model){
List<Film> allMyFilms = filmService.getAllFilms();
model.addAttribute("films", allMyFilms);
return "film/film-list";
}
順便說一下,為了完整起見,這里是我的服務/存儲庫層:
@Service
@RequiredArgsConstructor
public class FilmServiceImpl implements FilmService {
private final FilmRepository filmRepo;
...
@Override
public List<Film> getAllFilms() {
List<Film> films = filmRepo.findAll();
return films;
}
存儲層:
@Repository
public interface FilmRepository extends JpaRepository<Film, Long> {
List<Film> findAll();
}
你如何驗證該協會是渴望的? Spring MVC 默認啟用了名為“在視圖中打開 session”的功能,它允許延遲加載直到請求完成。 如果您“檢查”數據是否通過調試器加載,調試器將調用PersistentBag
的toString
方法,該方法將初始化惰性集合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.