Hibernate(十四)抓取策略
抓取策略:
抓取策略是當應用程式需要在(Hibernate實體物件圖的)關聯關係間進行導航的時候,Hibernate如何獲取關聯物件的策略。Hibernate的抓取策略是Hibernate提升效能的一種手段,可以在獲取關聯物件的時候,對傳送的語句進行優化,但是往往抓取策略需要和延遲載入一起使用來提升效能。
延遲載入的分類:
延遲載入(lazy load)是(也稱為懶載入)Hibernate關聯關係物件預設的載入方式,延遲載入機制是為了避免一些無謂的效能開銷而提出來的,所謂延遲載入就是當在真正需要資料的時候,才真正執行資料載入操作。
通常將延遲載入分為兩類:一類叫做類級別延遲,另一類叫做關聯級別的延遲
類級別的延遲載入
使用load方法檢索某個物件的時候,這個類是否採用延遲載入的策略,就是類級別的延遲。類級別的延遲一般在<class>上配置lazy屬性,lazy的預設值是true。預設是延遲載入的,所以使用load方法去查詢的時候,不會馬上傳送SQL語句,當真正使用該物件的時候,才會傳送SQL語句。
Customer customer = session.load(Customer.class,1l);
其實如果不想使用延遲載入也有很多種方法,當然最簡單的就是將這個類的對映檔案上的lazy設定為false,當然也可以將這個持久化類改為final修飾,如果改為final修飾的話,就無法生成代理類,就會使延遲載入失效。
這是類級別的延遲載入,類級別的延遲載入一般我們不進行修改,採用預設值lazy="true"就可以了。
其實主要的是關聯級別的延遲載入,關聯級別的延遲載入指的是查詢到某個物件以後,檢索它的關聯物件的時候是否採用延遲載入。
關聯級別的延遲載入
Customer customer = session.get(Customer.class ,1l);
Set<LinkMan> linkMans = customer.getLinkMans();
通過客戶查詢其關聯的聯絡人物件,在查詢聯絡人的時候是否採用延遲載入稱為是關聯級別的延遲。關聯級別的延遲。關聯級別的延遲通常是在<set>和<many-to-one>上來進行配置。
<set>標籤上的lazy通常有三個取值:
true:預設值,採用延遲載入
false:檢索關聯物件的時候,不採用延遲載入。
extra:極其懶惰
<many-to-one>標籤上的lazy通常有三個取值:
proxy:預設值,是否採用延遲取決於一的一方類上的lazy屬性的值
false:檢索關聯物件的時候,不採用延遲載入
no-proxy:不用研究
延遲載入介紹過了,延遲載入也是往往和抓取策略一起使用提升開發的程式的效能的。那麼接下來我們要研究抓取策略了。
抓取策略指的是查詢到某個物件的時候,如何抓取其關聯物件。這個也可以通過配置完成。在關聯物件的標籤上配置fetch屬性。關聯上就分為是在<set>和<many-to-one>上,也都有不同的取值。
<set>標籤上的fetch通常有三個取值:
select:預設值,傳送的是普通的select語句查詢。
join:傳送一條迫切左外連線去查詢。
subselect:傳送一條子查詢語句查詢其關聯物件。
<many-to-one>標籤上的fetch有兩個取值:
select:預設值,傳送一條普通的select語句查詢關聯物件。
join:傳送一條迫切左外連線語句查詢其關聯物件。
這樣來看set上配置fetch有三個值,lazy有三個值,這樣就會產生很多種的效果。其實不用擔心,因為fetch如果設定為join,lazy就會失效了。
總結fetch和lazy的作用,其實fetch主要控制抓取關聯物件的時候的傳送SQL語句的格式的。lazy主要控制查詢其關聯物件的時候是否採用延遲載入的。