1+N問題也可以叫N+1問題,什么是1+N問題呢?
如果在一個(gè)對(duì)象里關(guān)聯(lián)另一個(gè)對(duì)象,并且fetch = FetchType.EAGER。
比如說ManyToOne(OneToMany也存在這種問題)關(guān)聯(lián),本來只需要取Many里的對(duì)象屬性,可是Many里關(guān)聯(lián)的對(duì)象都會(huì)單獨(dú)再發(fā)一條語句取關(guān)聯(lián)對(duì)象的屬性。
本來只用發(fā)一條就可以查出Many里的對(duì)象屬性,可是它發(fā)了一條語句后,再發(fā)N條語句取關(guān)聯(lián)對(duì)象的數(shù)據(jù)。

解決辦法:
1、fetch = FetchType.LAZY:在合適的時(shí)候才發(fā)出語句(按需要發(fā)語句)。
2、BatchSize:在One對(duì)象設(shè)置Size后,取出Many里的數(shù)據(jù)后,再發(fā)N/Size條語句取關(guān)聯(lián)對(duì)象的數(shù)據(jù),從而達(dá)到少發(fā)語句的目的。
3、Join Fetch:將Many與One做外連接,因此只要發(fā)一條語句就可以查出Many與其相關(guān)聯(lián)的One對(duì)象數(shù)據(jù),Criteria默認(rèn)就是這種做法。

如何選擇解決辦法:
如果只要用Many里的對(duì)象,不用關(guān)聯(lián)對(duì)象的屬性,那就用方法1解決;
如果要Many里的對(duì)象屬性,也想要關(guān)聯(lián)的對(duì)象屬性就用方法3解決。