1. 程式人生 > >Hibernate(十四)抓取策略

Hibernate(十四)抓取策略

抓取策略:

抓取策略是當應用程式需要在(Hibernate實體物件圖的)關聯關係間進行導航的時候,Hibernate如何獲取關聯物件的策略。Hibernate的抓取策略是Hibernate提升效能的一種手段,可以在獲取關聯物件的時候,對傳送的語句進行優化,但是往往抓取策略需要和延遲載入一起使用來提升效能。

延遲載入的分類:

  延遲載入(lazy load)是(也稱為懶載入)Hibernate關聯關係物件預設的載入方式,延遲載入機制是為了避免一些無謂的效能開銷而提出來的,所謂延遲載入就是當在真正需要資料的時候,才真正執行資料載入操作。

  通常將延遲載入分為兩類:一類叫做類級別延遲,另一類叫做關聯級別的延遲

。類級別的延遲指的是查詢某個物件的時候,是否採用有延遲,這個通常在<class>標籤上配置lazy屬性。關聯級別的延遲指的是,查詢一個物件的關聯物件的時候是否採用延遲載入。這個通常在<set>或<many-to-one>上配置lazy屬性。

類級別的延遲載入

    使用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主要控制查詢其關聯物件的時候是否採用延遲載入的。