1. 程式人生 > >對hibernate的簡單理解,未完待續

對hibernate的簡單理解,未完待續

一、hibernate的理解

百度百科:

        hibernate是一個開源的ORM(物件關係對映)框架。ORM即object-relation mapping,它的作用就是在關係型資料庫和物件之間做了一個對映,從物件對映到關係,在從關係對映到物件。這樣我們在操作資料庫的時候,不需要再去和複雜的sql打交道,只要想操作物件一樣的操作它就可以了(把關係型資料庫的欄位在記憶體中對映成物件的屬性)。

圖中可看出hibernate有六大核心介面。兩個主要配置檔案,以及他們直接的關係,簡單認識

1、Configuration介面:負責配置並啟動hibernate

2、SessionFactory介面:負責初始化hibernate

3、Session介面:負責持久化物件的CURD操作

4、Transaction介面:負責事務

5、Query和Criteria介面:負責執行各種資料庫查詢

注意“Configuration例項是啟動期間的物件,一旦Session Factory建立完成它就被丟棄了

 

        使用Hibernate的基本流程是:配置Configuration物件、產生SessionFactory、建立session物件,啟動事務,完成CRUD操作,提交事務,關閉session。

         在應用Hibernate時,重點要了解Session的快取原理,級聯,延遲載入和hql查詢。

優點:

1、更加物件化。以物件的思維操作資料庫,只需要操作物件就可以了,開發更加物件化

2、移植性。hibernate做了持久層的封裝,你就不知道資料庫,你寫的所有的程式碼都具有可複用性

3、hibernate是一個沒有侵入性的框架,沒有侵入性的框架稱為輕量級框架。對比struts的Action和ActionForm,都是需要繼承,離不開struts,hibernate不需要繼承任何類,不需要實現任何藉口,這樣的物件叫:POJO物件。

4、hibernate測試方便,提高效率和生產力

缺點:

1、使用資料庫特性的語句,將很難調優

2、對大批量資料更新存在問題

3、系統中存在大量的攻擊查詢功能

 

Hibernate快取機制

一級快取(Session快取)

        又稱session快取,hibernate內建的,不可解除安裝的

1、Session的save()方法持久一個物件後,該物件加入到Session的快取中,以後即使應用程式中的引用變數不再引用改物件,只要session的快取沒有被清空,該物件任然處於生命週期

2、擋Session的get()方法試圖從資料庫中載入物件時,Session優先判斷快取是否存在該物件,如果存在,則不需要去 資料庫中檢索

物件快取是在記憶體中的

作用

1、減少資料庫的訪問次數, 
2、保證快取和資料庫的一致性。當快取的物件變化後,不會馬上執行sql ,這使得Session能把幾條相關的sql 合併成一條sql 來執行

Session清理快取

清理快取是指按照快取的中物件的屬性變化來同步更新資料庫 
清理快取的時間點 
1、呼叫commit(),commit()方法先清理快取,然後再向資料庫提交事物 
2、呼叫Query查詢介面等執行查詢操作時候,如果快取中持久化了物件的屬性變化,就會先清理快取,以保證查詢結果為最新 
3、顯示呼叫Session的flush()方法的時候

如何清除一級快取?

  通過session.clear();//清除所有快取

    session.evict();//清除指定快取

二級快取(SessionFactory快取)

  由於SessionFactory物件的生命週期和應用程式的整個過程對應,因此Hibernate二級快取是程序範圍或者叢集範圍的快取,有可能出現併發問題,因此需要採用適當的併發訪問策略,該策略為被快取的資料提供了事務隔離級別。

  save、update、saveOrupdate、load、get、list、query、Criteria方法都會填充二級快取

  get、load、iterate會從二級快取中取資料session.save(user)   

  如果user主鍵使用“native”生成,則不放入二級快取.

  第二級快取是可選的,是一個可配置的外掛,預設下SessionFactory不會啟用這個外掛。Hibernate提供了org.hibernate.cache.CacheProvider介面,它充當快取外掛與Hibernate之間的介面卡。

 

Hibernate的二級快取策略的一般過程如下:
    
1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有欄位)這樣的SQL語句查詢資料庫,一次獲得所有的資料物件。
    2) 把獲得的所有資料物件根據ID放入到第二級快取中。
    3) 當Hibernate根據ID訪問資料物件的時候,首先從Session一級快取中查;查不到,如果配置了二級快取,那麼從二級快取中查;查不到,再查詢資料庫,把結果按照ID放入到快取。
    4) 刪除、更新、增加資料的時候,同時更新快取。
  Hibernate的二級快取策略,是針對於ID查詢的快取策略,對於條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的查詢快取(Query Cache)。

如何清除二級快取?

  需要用SessionFactory來管理二級快取

什麼樣的資料適合存放到第二級快取中?   
  1) 很少被修改的資料   
  2) 不是很重要的資料,允許出現偶爾併發的資料   
  3) 不會被併發訪問的資料   
  4) 常量資料   
不適合存放到第二級快取的資料?   
  1) 經常被修改的資料   
  2) 絕對不允許出現併發訪問的資料,如財務資料,絕對不允許出現併發   
  3) 與其他應用共享的資料。

二、hibernate的使用

為什麼使用Hibernate框架?

原因如下:

  • Hibernate對JDBC訪問資料庫的程式碼做了封裝,大大簡化了資料訪問層繁瑣的重複性程式碼。
  • Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現,它很大程度的簡化了dao層編碼工作。

總結:Hibernate是企業級開發中的主流框架,對映的靈活性很出色。它支援很多關係型資料庫

Hibernate提供了3.x 、4.x、 5.x版本

https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/

2.1、註解開發

常用註解:

@Entity

作用:指定當前類是實體類。寫上此註解用於在建立SessionFactory/EntityManager時,載入對映配置。

@Table

作用:指定實體類和表之間的對應關係。

屬性:

name:指定資料庫表的名稱

@Id

作用:指定當前欄位是主鍵。

@GeneratedValue

作用:指定主鍵的生成方式。JPA的主鍵生成方式詳解見2.4小節的說明。

屬性:

strategy :指定主鍵生成策略。JPA支援四種生成策略,具體介紹看2.4小節。

@Column

作用:指定實體類屬性和資料庫表之間的對應關係

屬性:

name:指定資料庫表的列名稱。

unique:是否唯一  
nullable:是否可以為空  
inserttable:是否可以插入  
updateable:是否可以更新  
columnDefinition: 定義建表時建立此列的DDL  
secondaryTable: 從表名。如果此列不建在主表上(預設建在主表),該屬性定義該列所在從表的名字。  

 

一對多關係對映:

    常用註解

         [email protected]

      作用:

                建立一對多的關係對映

      屬性:

                  targetEntityClass:指定多的方的類的位元組碼

                  mappedBy:指定從表實體類中引用主表物件的名稱。

                  cascade:指定要使用的級聯操作

                  fetch:指定是否採用延遲載入

                  orphanRemoval:是否使用孤兒刪除

 

            @ManyToOne

            作用:

                  建立多對一的關係

            屬性:

                  targetEntityClass:指定一的一方實體類位元組碼

                  cascade:指定要使用的級聯操作

                  fetch:指定是否採用延遲載入

                  optional:關聯是否可選。如果設定為false,則必須始終存在非空關係。

      @JoinColumn

            作用:

                  用於定義主鍵欄位和外來鍵欄位的對應關係。

            屬性:

                  name:指定外來鍵欄位的名稱

                  referencedColumnName:指定引用主表的主鍵欄位名稱

                  unique:是否唯一。預設值不唯一

                  nullable:是否允許為空。預設值允許。

                  insertable:是否允許插入。預設值允許。

                  updatable:是否允許更新。預設值允許。

                  columnDefinition:列的定義資訊。

 

 

聯絡hibernate的一級快取,熟悉物件的三種狀態。

Hibernate框架為了更好管理持久化類,將持久化類分成了三種狀態:

  1. 瞬時態 :沒有持久化標識OID,沒有被session操作管理。
  2. 持久態 :有持久化標識OID,已經被session操作管理。
  3. 脫管態(離線態) :有持久化標識OID,沒有被session操作管理。