Hibernate概念與常見問題總結(jié)
相信大家在學(xué)習(xí)新概念的時(shí)候都會(huì)總結(jié)一些筆記。下面是一些hibernate概念的總結(jié),以及一些Hibernate常見問題的解決方法。
----------------hibernate概念開始----------------
Hibernate簡單講就是ORM,對(duì)象關(guān)系映射的一種技術(shù),直接將POJO對(duì)象跟DB間的關(guān)系進(jìn)行配置,描述。
POJO狀態(tài)說明:
在利用hibernate API 操作數(shù)據(jù)庫時(shí),POJO的三種狀態(tài):
瞬時(shí)狀態(tài):當(dāng)POJO.new()時(shí)的狀態(tài)
持久化狀態(tài):在利用hibernate session對(duì)象進(jìn)行CRUD的時(shí)候處于的狀態(tài)
游離狀態(tài):session關(guān)閉后
POJO中【主鍵】屬性應(yīng)該盡可能的定義為包裝類型,雖然很多人認(rèn)為基本類型數(shù)據(jù)不需要進(jìn)行對(duì)象的封箱和解箱操作,但是在hibernate中,主鍵是被轉(zhuǎn)化成對(duì)象進(jìn)行操作的。假設(shè)在設(shè)計(jì)POJO的時(shí)候我們將主鍵設(shè)置為基本數(shù)據(jù)類型,那么hibernate在接受后,需要轉(zhuǎn)換,當(dāng)用戶要換取時(shí),又要進(jìn)行數(shù)據(jù)轉(zhuǎn)換,這樣可能會(huì)導(dǎo)致效率更低。所以建議大家使用包裝類數(shù)據(jù)。
這里需要注意unsaved-value是個(gè)很重要的屬性。Hibernate通過這個(gè)屬性來判斷一個(gè)對(duì)象應(yīng)該save還是update,如果這個(gè)對(duì)象的id是unsaved-value的話,那說明這個(gè)對(duì)象不是 persistence object會(huì)進(jìn)行save(insert)操作;如果id是非unsaved-value的話,那說明這個(gè)對(duì)象是persistence object(數(shù)據(jù)庫中已存在),只要update就行了。
----------------hibernate概念結(jié)束----------------
以下是對(duì)Hibernate常見問題進(jìn)行的總結(jié):
------
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
------
引發(fā)這種問題的關(guān)鍵是:unsaved-value的值與JOPO中的id值不匹配。
例如:在POJO.hbm.xml中< id name="id" column="id" type="long" unsaved-value="null">
POJO中的id屬性類型為long類型(基本數(shù)據(jù)類型,無數(shù)據(jù)時(shí),值為0)。
測試:現(xiàn)在new()一個(gè)POJO,默認(rèn)id值肯定為0,在hibernate-mapping中找到這個(gè)POJO節(jié)點(diǎn)后,發(fā)現(xiàn)它的id的unsaved-value為null,此時(shí)無法匹配,后續(xù)判斷的操作也就無從下手,于是出現(xiàn)上述錯(cuò)誤。
以上就是對(duì)Hibernate常見問題的總結(jié)。
【編輯推薦】