自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

概述Hibernate equals()方法

開發(fā) 后端
這里介紹Hibernate equals()方法,在java語言中,對象標(biāo)識符是由每個對象都持有的Hibernate equals()方法(以及相關(guān)的hashCode()方法來定義的。

在向大家詳細介紹Hibernate equals()方法之前,首先讓大家了解下Java應(yīng)用程序,然后全面介紹Hibernate equals()方法。

當(dāng)對象持久化到數(shù)據(jù)庫中時,對象的標(biāo)識符總時很難被恰當(dāng)?shù)膶崿F(xiàn)。盡管如此,問題其實完全是由存在著在保存之前不持有ID的對象的現(xiàn)象衍生而來的。我們可以通過從諸如Hibernate這樣的對象—關(guān)系映像框架手中取走指派對象ID的職責(zé)來解決這個問題。相對的,一旦對象被實例化,它就應(yīng)該被指派一個ID.這使對象標(biāo)識符變成簡單而不易出錯,也減少了領(lǐng)域模型中需要的代碼量。

企業(yè)級Java應(yīng)用程序常常把數(shù)據(jù)在java對象和關(guān)系型數(shù)據(jù)庫之間來回移動。從手動編寫SQL代碼到使用諸如Hibernate這樣的成熟的對象——關(guān)系映像(ORM)解決方案,有很多種方法可以實現(xiàn)這個過程。無論你采用什么樣的技術(shù),一旦你開始將java對象持久化到數(shù)據(jù)庫中,對象標(biāo)識符都將成為一個復(fù)雜而且難以管理的課題。可能出現(xiàn)的情況是:你實例化了兩個不同的對象,而它們卻代表了數(shù)據(jù)庫中的同一行。為了解決這個問題,你可能采取的措施是在你的持久化對象中實現(xiàn)equals() 和hashCode()這兩個方法,可是要恰當(dāng)?shù)膶崿F(xiàn)這兩個方法比乍看之下要有技巧一些。讓問題更糟糕的是,那些傳統(tǒng)的思路(包括Hibernate官方文檔所提倡的那些)對于新的工程并不一定能提出最實用的解決方案。

對象標(biāo)識在虛擬機(VM)中和在數(shù)據(jù)庫中的差異是問題滋生的溫床。在虛擬機中,你并不會得到對象的id,你只是簡單的持有對象的直接引用。而在幕后,虛擬機確實給每個對象指派了一個8字節(jié)大小的id,這個id才是對象的真實引用。當(dāng)你將對象持久化到數(shù)據(jù)庫中的時候,問題開始產(chǎn)生了。假定你創(chuàng)建了一個 Person對象并將它存入數(shù)據(jù)庫(我們可以叫它person1)。而你的其它某段代碼從數(shù)據(jù)庫中讀取了這個Person對象的數(shù)據(jù)并將它實例化為另一個新的Person對象(我們可以叫它Person2)?,F(xiàn)在你的內(nèi)存中有了兩個映像到數(shù)據(jù)庫中同一行的對象。一個對象引用只能指向它們倆的其中一個,可是我們需要一種方法來表示這兩個對象實際上表示著同一個實體。這就是(在虛擬機中)引入對象標(biāo)識符的原因。

在java語言中,對象標(biāo)識符是由每個對象都持有的Hibernate equals()方法(以及相關(guān)的hashCode()方法)來定義的。無論兩個對象(引用)是否為同一個實例,Hibernate equals()方法都應(yīng)該能夠判別出它們是否表示同一個實體。hashCode()方法和Hibernate equals()方法有關(guān)聯(lián)是因為所有被判斷等價(equal)的對象都應(yīng)該返回相同的哈希值(hashCode)。在缺省實現(xiàn)中,Hibernate equals()方法僅僅比較對象的引用,一個對象和它自身是等價的,而和其它任何實例都不等價。對于持久化對象來說,重寫這兩個方法,讓代表著數(shù)據(jù)庫中同一行的兩個對象被判為等價是很重要的。而這對于java中的Collection數(shù)據(jù)結(jié)構(gòu)(Set,Map和List)的正確工作更是尤為重要。

為了闡明實現(xiàn)equal()和hashCode()的不同途徑,讓我們一起考慮一個準(zhǔn)備持久化到數(shù)據(jù)庫中的簡單對象Person.

  1. public class Person {   
  2. private Long id;   
  3. private Integer version;  
  4. public Long getId() { return id; }   
  5. public void setId(Long id) {  
  6. this.id = id;   
  7. }  
  8. public Integer getVersion() {  
  9. return version;   
  10. }  
  11. public void setVersion(Integer version) {   
  12. this.version = version;   
  13. }  
  14. // person-specific properties and behavior  

在這個例子中,我們遵循了同時持有id字段和version字段的最佳實踐。Id字段保存了在數(shù)據(jù)庫中作為主鍵使用的值,而version字段則是一個從0開始增長的增量,隨著對象的每次更新而變化(它幫助我們避免并發(fā)更新的問題)。為了看的更清楚,我們也一起看一下Hibernate把這個對象持久化到數(shù)據(jù)庫的映像文件。

  1. <?XML version="1.0"?>  
  2. <hibernate-mapping package="my.package">   
  3. <class name="Person" table="PERSON">  
  4. <id name="id" column="ID" unsaved-value="null">  
  5. <generator class="sequence">   
  6. <param name="sequence">PERSON_SEQ</param>  
  7. </generator>  
  8. </id>  
  9. <version name="version" column="VERSION" />   
  10. <!-- Map Person-specific properties here. -->  
  11. </class>  
  12. </hibernate-mapping> 

【編輯推薦】

  1. Hibernate Util簡單討論
  2. 詳解優(yōu)化Hibernate性能經(jīng)驗
  3. 概述Hibernate dbcp連接池使用方法
  4. 淺析Hibernate.cfg.xml配置
  5. Hibernate Shard基礎(chǔ)分析
責(zé)任編輯:佚名 來源: 中國IT實驗室
相關(guān)推薦

2009-06-29 08:48:41

Hibernate緩存

2009-09-29 16:04:29

Hibernate S

2009-09-25 16:27:33

Hibernate S

2009-09-21 17:55:14

Hibernate O

2009-09-22 15:10:22

Hibernate映射

2009-09-23 17:03:08

Hibernate S

2009-09-28 12:57:54

Hibernate C

2009-09-22 09:13:43

Hibernate D

2009-09-22 14:57:34

Hibernate d

2009-09-28 15:14:45

Hibernate S

2009-09-23 10:41:10

對象標(biāo)識符Hibernate

2009-09-27 14:41:05

Hibernate I

2009-06-12 15:09:01

Hibernate優(yōu)化

2009-09-23 16:54:08

Hibernate修改

2009-06-16 16:27:22

Hibernate優(yōu)化

2009-09-28 13:29:41

加載過程Hibernate訪問

2009-06-12 16:00:13

Session方法Hibernate

2009-09-23 17:32:07

Hibernate S

2009-09-24 13:25:58

Hibernate m

2009-09-23 14:00:07

Hibernate連接
點贊
收藏

51CTO技術(shù)棧公眾號