1+N問題也可以叫N+1問題,什么是1+N問題呢?
如果在一個對象里關聯另一個對象,并且fetch = FetchType.EAGER。
比如說ManyToOne(OneToMany也存在這種問題)關聯,本來只需要取Many里的對象屬性,可是Many里關聯的對象都會單獨再發一條語句取關聯對象的屬性。
本來只用發一條就可以查出Many里的對象屬性,可是它發了一條語句后,再發N條語句取關聯對象的數據。
解決辦法:
1、fetch = FetchType.LAZY:在合適的時候才發出語句(按需要發語句)。
2、BatchSize:在One對象設置Size后,取出Many里的數據后,再發N/Size條語句取關聯對象的數據,從而達到少發語句的目的。
3、Join Fetch:將Many與One做外連接,因此只要發一條語句就可以查出Many與其相關聯的One對象數據,Criteria默認就是這種做法。
如何選擇解決辦法:
如果只要用Many里的對象,不用關聯對象的屬性,那就用方法1解決;
如果要Many里的對象屬性,也想要關聯的對象屬性就用方法3解決。