簡體   English   中英

為什么 Spring MVC controller 方法會忽略 FetchType.LAZY 行為並像 FetchType.EAGER 一樣工作?

[英]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”的功能,它允許延遲加載直到請求完成。 如果您“檢查”數據是否通過調試器加載,調試器將調用PersistentBagtoString方法,該方法將初始化惰性集合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM