溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Hibernate映像文件是什么

發(fā)布時(shí)間:2021-12-06 09:16:04 來(lái)源:億速云 閱讀:126 作者:iii 欄目:編程語(yǔ)言

這篇文章主要講解了“Hibernate映像文件是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Hibernate映像文件是什么”吧!

Hibernate映像文件實(shí)例

們已經(jīng)從改用這樣的純凈的對(duì)象id中獲取了不少好處。我們對(duì)equals()和hashCode()方法的實(shí)現(xiàn)更加簡(jiǎn)單而且容易閱讀。這些方法再也不易出錯(cuò)而且無(wú)論在保存對(duì)象之前還是之后,它們都能和Collection一起正常工作。Hibernate也能夠變的更快一些,這是因?yàn)樵诒4嫘碌膶?duì)象之前它再也不需要從數(shù)據(jù)庫(kù)讀取一個(gè)序列值。此外,新定義的equals()和hashCode()對(duì)于一個(gè)包含 id對(duì)象的對(duì)象來(lái)說(shuō)是具有通用性的。這意味著我們可以把這些方法移動(dòng)到一個(gè)抽象的父類當(dāng)中去。我們不再需要為每一個(gè)域?qū)ο笾匦聦?shí)現(xiàn)equals()和 hashCode(),而且我們也不再需要考慮對(duì)于一個(gè)類來(lái)說(shuō)哪些字段的組合是***且不變的。我們只要簡(jiǎn)單地繼承這個(gè)抽象類。當(dāng)然,我們沒(méi)必要強(qiáng)迫我們的域?qū)ο罄^承一個(gè)父類,所以我們定義了一個(gè)接口來(lái)保證設(shè)計(jì)的靈活性。

public interface PersistentObject {   public String getId();  public void setId(String id);  public Integer getVersion();  public void setVersion(Integer version);  }  public abstract class AbstractPersistentObject implements PersistentObject {  private String id = IdGenerator.createId();   private Integer version;  public String getId() { return id;   }  public void setId(String id) { this.id = id; }  public Integer getVersion() { return version; }  public void setVersion(Integer version) { this.version = version; }  public boolean equals(Object o) {   if (this == o) return true;  if (o == null || !(o instanceof PersistentObject)) { return false; }  PersistentObject other = (PersistentObject)o;  // if the id is missing,   return false  if (id == null) return false;   // equivalence by id   return id.equals(other.getId());  }  public int hashCode() {   if (id != null) {  return id.hashCode();   } else {   return super.hashCode();   }  }  public String toString() {   return this.getClass().getName() + "[id=" + id + "]";  }  }

現(xiàn)在我們有了一個(gè)簡(jiǎn)單而高效的方法來(lái)創(chuàng)建域?qū)ο?。它們繼承了AbstractPersistentObject,這個(gè)父類能在它們***次被創(chuàng)建時(shí)自動(dòng)賦予它們一個(gè)id并且恰當(dāng)?shù)膶?shí)現(xiàn)了equals()和hashCode()這兩個(gè)方法。域?qū)ο笠驳玫搅艘粋€(gè)對(duì)toString()方法的合理的缺省實(shí)現(xiàn),這個(gè)方法可以有選擇地被重寫。如果這是一個(gè)查詢例子的測(cè)試對(duì)象或者例子對(duì)象,id值時(shí)可以被改變或者被設(shè)為null。否則它是不應(yīng)當(dāng)被改變的。如果因?yàn)槟承┰蛭覀冃枰獎(jiǎng)?chuàng)建一個(gè)繼承自其它類的域?qū)ο螅@個(gè)對(duì)象就應(yīng)當(dāng)實(shí)現(xiàn)PersistentObject接口而不是繼承抽象類。

public class Person extends AbstractPersistentObject {   // Person-specific fields and behavior here  }

從上一個(gè)例子開(kāi)始Hibernate映像文件就不會(huì)再改變了。我們不想麻煩Hibernate去了解抽象父類,相對(duì)的,我們只要保證每個(gè)持久化對(duì)象的映射文件包含一個(gè)id項(xiàng)(和一個(gè)被指派的生成器)和一個(gè)帶有unsaved- value="null"屬性的version標(biāo)簽。機(jī)敏的讀者可能已經(jīng)注意到,每當(dāng)一個(gè)持久化對(duì)象被實(shí)例化的時(shí)候,它的id值得到了指派。這意味著當(dāng)Hibernate在內(nèi)存中創(chuàng)建一個(gè)已經(jīng)保存過(guò)的對(duì)象時(shí),雖然這個(gè)對(duì)象是已經(jīng)存在并從數(shù)據(jù)庫(kù)中讀取的,它也會(huì)得到一個(gè)新的id。這不會(huì)產(chǎn)生問(wèn)題,因?yàn)镠ibernate會(huì)接著調(diào)用對(duì)象的setId()方法,用保存的真實(shí)id來(lái)替換新分配的id。剩下的id生成器并不是問(wèn)題,因?yàn)閷?shí)現(xiàn)它的算法是輕量級(jí)的(也就是說(shuō),它并不牽扯到數(shù)據(jù)庫(kù))。

到現(xiàn)在為止一切都很好,但是我們遺漏了一個(gè)重要的細(xì)節(jié):如何實(shí)現(xiàn)IdGenerator.createId().我們可以為我們理想中的鍵值生成器(key-generation)算法定義一些標(biāo)準(zhǔn)。
◆鍵值可以不牽扯到數(shù)據(jù)庫(kù)而很輕量級(jí)的產(chǎn)生
◆即使跨越不同的虛擬機(jī)和不同機(jī)器,鍵值也要保證***性。
◆如果可能鍵值可以由其它程序,編程語(yǔ)言和數(shù)據(jù)庫(kù)生成,至少要能和它們兼容

感謝各位的閱讀,以上就是“Hibernate映像文件是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Hibernate映像文件是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI