Hibernate和JPA的抓取策略是有差異的。這一點在使用JPA注解時會有所體現。有時候我們需要添加一些hibernate獨有的注解才能實現比較好的抓取。下面簡單提幾點。
所謂“抓取策略”,總要涉及兩個問:何時抓取以及如果抓取。這兩點在Hibernate提供的注解上體現的非常明顯。Hibernate提供兩套注解分別用來描述“何時抓取”和“如何抓取”。這樣看起來非常條理和清晰。但是JPA顯然沒有這么做。它只提供了fetch=FeatchType.LAZY or FetchType.EAGER.但是我們必須明白這兩種選項對應的實際抓取策略是什么。
對于fetch=FeatchType.LAZY:何時抓?。簂azy,如何抓取:select
對于fetch=FeatchType.EAGER:何時抓?。篹ager,如何抓?。簀oin
這就是JPA對抓取策略的描述。因為它對于lazy和eager只各提供一種抓取方法,因此它就不需要再指定“如何抓取”了。但是hibernate還提供一種subselect抓取,它是配合lazy=true的抓取方法。
如果想要使用subselect抓取,你可以用hibernate的FetchMode.SUBSELECT注解覆寫JPA的配制,但是lazy=true這一點,你還是需要使用fetch=FetchType.LAZY來配制的,你只是替換了它的select抓取方法。