Hibernate中的find與普通createQuery的區(qū)別
Hibernate中的find是根據(jù)主鍵首先去緩存中查找,找到就直接返回,找不到就接著去數(shù)據(jù)庫中查找;
而createQuery直接就去數(shù)據(jù)庫中查找,不管緩存中是不是已經(jīng)存在了;
兩者一般情況下邏輯效果是一樣的,只是性能上有些差別,但有些特定情況下就不同了。
輸入一批“水表數(shù)據(jù)信息”,循環(huán)處理這些信息,當(dāng)水表信息表示的水表不在數(shù)據(jù)庫中時就根據(jù)這些信息構(gòu)造水表實體存入數(shù)據(jù)庫,輸入的“水表數(shù)據(jù)信息”可能有相同的水表信息,這樣就會有多次查找同樣水表的查詢,但他們返回的結(jié)果不應(yīng)當(dāng)是相同的,第一次沒查到就新建一個,再次查詢時應(yīng)該能查到,否則水表就會重復(fù)了。這時候Hibernate find與普通createQuery的區(qū)別就顯示出來了,新建后再find同樣的水表就會查出剛剛建立的水表(雖然他還沒有進(jìn)入數(shù)據(jù)庫,因為循環(huán)完后才commit),而createQuery每次查詢結(jié)果都相同(查不到,因為數(shù)據(jù)庫里沒有該水表),這樣就會新建多個相同的水表,導(dǎo)致數(shù)據(jù)庫主鍵重復(fù)異常。
【編輯推薦】