在Java語言中,對象之間的比較可以通過引用比較(==)和內(nèi)容比較(equals)兩種方式進(jìn)行,而在Hibernate的實體對象的比較是通過主鍵值來比較,如果要實現(xiàn)自己的識別邏輯,則需要重寫equals方法和hashCode方法。
檢查數(shù)據(jù)對象改變檢查的一般策略有下面兩種:
1. 數(shù)據(jù)對象監(jiān)控
數(shù)據(jù)對象監(jiān)控的實現(xiàn)方式,通過攔截器對數(shù)據(jù)對象的設(shè)值方法進(jìn)行攔截。一旦數(shù)據(jù)對象的設(shè)置方法被調(diào)用,則將其標(biāo)志為“待更新”狀態(tài),之后在數(shù)據(jù)庫操作時將其更新到對應(yīng)的庫表。
2. 數(shù)據(jù)版本對比
在持久層框架中維持?jǐn)?shù)據(jù)對象的最近讀取版本,當(dāng)數(shù)據(jù)提交時將提交數(shù)據(jù)與此版本進(jìn)行比對,如果發(fā)生變化則將其同步到數(shù)據(jù)庫對應(yīng)的庫表。
Hibernate采取的是第二種檢查策略。它采用一個內(nèi)部數(shù)據(jù)結(jié)構(gòu)"EntityEntry"保存對應(yīng)實體類的狀態(tài)信息。
對于級聯(lián)對象的更新,Hibernate將根據(jù)unsaved-value進(jìn)行判定。首先Hibernate會取出目標(biāo)對象的id。之后,將此值與unsaved-value進(jìn)行比對,如果相等,則認(rèn)為目標(biāo)對象尚未保存,否則,認(rèn)為對象已經(jīng)保存,無需再進(jìn)行保存操作。