對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 來執行
清理快取是指按照快取的中物件的屬性變化來同步更新資料庫
清理快取的時間點
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: 從表名。如果此列不建在主表上(預設建在主表),該屬性定義該列所在從表的名字。
一對多關係對映:
常用註解
作用:
建立一對多的關係對映
屬性:
targetEntityClass:指定多的方的類的位元組碼
mappedBy:指定從表實體類中引用主表物件的名稱。
cascade:指定要使用的級聯操作
fetch:指定是否採用延遲載入
orphanRemoval:是否使用孤兒刪除
@ManyToOne
作用:
建立多對一的關係
屬性:
targetEntityClass:指定一的一方實體類位元組碼
cascade:指定要使用的級聯操作
fetch:指定是否採用延遲載入
optional:關聯是否可選。如果設定為false,則必須始終存在非空關係。
@JoinColumn
作用:
用於定義主鍵欄位和外來鍵欄位的對應關係。
屬性:
name:指定外來鍵欄位的名稱
referencedColumnName:指定引用主表的主鍵欄位名稱
unique:是否唯一。預設值不唯一
nullable:是否允許為空。預設值允許。
insertable:是否允許插入。預設值允許。
updatable:是否允許更新。預設值允許。
columnDefinition:列的定義資訊。
聯絡hibernate的一級快取,熟悉物件的三種狀態。
Hibernate框架為了更好管理持久化類,將持久化類分成了三種狀態:
- 瞬時態 :沒有持久化標識OID,沒有被session操作管理。
- 持久態 :有持久化標識OID,已經被session操作管理。
- 脫管態(離線態) :有持久化標識OID,沒有被session操作管理。