成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

概述Hibernate equals()方法

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

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

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

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

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

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

為了闡明實現equal()和hashCode()的不同途徑,讓我們一起考慮一個準備持久化到數據庫中的簡單對象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字段保存了在數據庫中作為主鍵使用的值,而version字段則是一個從0開始增長的增量,隨著對象的每次更新而變化(它幫助我們避免并發更新的問題)。為了看的更清楚,我們也一起看一下Hibernate把這個對象持久化到數據庫的映像文件。

  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. 詳解優化Hibernate性能經驗
  3. 概述Hibernate dbcp連接池使用方法
  4. 淺析Hibernate.cfg.xml配置
  5. Hibernate Shard基礎分析
責任編輯:佚名 來源: 中國IT實驗室
相關推薦

2009-09-29 16:04:29

Hibernate S

2009-06-29 08:48:41

Hibernate緩存

2009-09-22 15:10:22

Hibernate映射

2009-09-28 12:57:54

Hibernate C

2009-09-22 09:13:43

Hibernate D

2009-09-23 17:03:08

Hibernate S

2009-09-21 17:55:14

Hibernate O

2009-09-25 16:27:33

Hibernate S

2009-09-22 14:57:34

Hibernate d

2009-09-28 15:14:45

Hibernate S

2009-09-23 10:41:10

對象標識符Hibernate

2009-09-23 16:54:08

Hibernate修改

2009-06-16 16:27:22

Hibernate優化

2009-06-12 15:09:01

Hibernate優化

2009-09-27 14:41:05

Hibernate I

2009-09-28 13:29:41

加載過程Hibernate訪問

2009-09-23 17:32:07

Hibernate S

2009-09-24 13:25:58

Hibernate m

2009-06-12 16:00:13

Session方法Hibernate

2009-09-23 14:00:07

Hibernate連接
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品免费| 日本黄色的视频 | 亚洲国产精品一区二区三区 | 91免费在线看 | 精品国产一区二区三区久久久四川 | 91av大全| 日韩一区二区三区视频 | h视频免费在线观看 | 中文字幕三区 | 亚洲视频手机在线 | 成人久久久久久久久 | 黄色毛片免费视频 | 亚洲精品美女视频 | av免费网站在线观看 | 成人亚洲网| 麻豆视频在线免费观看 | 色综合久久天天综合网 | 日本免费视频 | 一区二区三区国产在线观看 | 美女久久视频 | 久久国产一区二区三区 | 亚洲最大的成人网 | 国产成人网 | 国产精品一区二区在线免费观看 | 午夜视频在线播放 | 国产精品毛片一区二区三区 | 综合久 | 欧美1区2区| 日韩在线免费播放 | 在线成人| 中日韩欧美一级片 | 欧美成年黄网站色视频 | 国产精品免费大片 | 色综合久 | 精品91久久| 国产精品美女久久久久久久网站 | 亚洲精品一 | 一区二区三区不卡视频 | 日本在线播放一区二区 | 亚洲永久字幕 | 精品一区二区三区在线播放 |