新聞中心
Hibernate有很多值得學(xué)習(xí)的地方,這里我們主要介紹對象標(biāo)識符,包括介紹Hibernate內(nèi)置的UUID生成器算法等方面。

站在用戶的角度思考問題,與客戶深入溝通,找到鐵東網(wǎng)站設(shè)計與鐵東網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、主機域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋鐵東地區(qū)。
我們需要的是通用唯一標(biāo)識符(UUID)。UUID是由標(biāo)準(zhǔn)格式化的16個字節(jié)大小的(128位)數(shù)字組成的。UUID的字符串版本是像這樣的:2cdb8cee-9134-453f-9d7a-14c0ae8184c6(大家應(yīng)該可以注意到, Jmatrix目前就是使用的UUID)
里面的字符是數(shù)字簡單的按字節(jié)的16進制表示,橫線把數(shù)字的不同部分分割開來。這種格式簡單而且易于處理,只是36個字符有點兒太長了。因為橫線總是被安置在相同的位置,所以可以把它們?nèi)サ舳炎址臄?shù)目減少到32個。用一種更為簡潔的表示方法,你可以創(chuàng)建一個byte[16]的數(shù)組或是兩個8字節(jié)大小的長整型(long)來保存這些數(shù)字。如果你使用的是Java1.5或更高版本,你可以直接使用UUID類,雖然這不是它在內(nèi)存中最簡潔的格式。如果你要獲得更多的信息,請參閱Wikipedia 的UUID條目 或 Java UUID參考文檔。
對UUID的產(chǎn)生算法有多種實現(xiàn)。既然最終UUID是一種標(biāo)準(zhǔn)格式,我們在IdGenerator類中采用哪一種實現(xiàn)都沒有關(guān)系。既然無論采用什么算法每個id都會被保證唯一,我們甚至可以在任何時候改變算法的實現(xiàn)或是混合匹配不同的實現(xiàn)。如果你使用的是java1.5或更高版本,最方便的實現(xiàn)是 java.util.UUID類。
- public class IdGenerator {
- public static String createId() {
- UUID uuid = java.util.UUID.randomUUID();
- return uuid.toString();
- }
- }
對不使用java1.5或更高版本的人來說,至少有兩種擴展庫實現(xiàn)了UUID并且和1.5之前的java版本兼容: Apache Commons ID project 和 Java UUID Generator(JUG) project.它們都在Apache的旗下。(在LGPL之下JUG也是可用的)
這是使用JUG庫實現(xiàn)IdGenerator的例子。
- import org.safehaus.uuid.UUIDGenerator;
- public class IdGenerator {
- public static final UUIDGenerator uuidGen = UUIDGenerator.getInstance();
- public static String createId() {
- UUID uuid = uuidGen.generateRandomBasedUUID();
- return uuid.toString();
- }
- }
Hibernate內(nèi)置的UUID生成器算法又如何呢?這是一個得到驗證對象標(biāo)識用的UUID的適當(dāng)途徑嗎?如果你想讓對象標(biāo)識符獨立于對象的持久化,這就不是一個好方法。雖然Hibernate確實提供有讓它為你生成UUID的選項,但這樣的話我們又回到了那個最早的問題上:對象ID的獲得并不在它們被創(chuàng)建的時候,而在它們被保存的時候。
使用UUID作為數(shù)據(jù)庫主鍵的***障礙是它們在數(shù)據(jù)庫中(而不是在內(nèi)存中)的大小,在數(shù)據(jù)庫中索引和外鍵的復(fù)合會促使主鍵大小的增加。你必須在不同的情況下使用不同的表示方法。使用String表示,數(shù)據(jù)庫的主鍵大小將會是32或36字節(jié)。Id也可以直接使用位存儲,這樣將減少一半的占用空間,但是如果你直接查詢數(shù)據(jù)庫,id將變得難以理解。這些方法對你的工程是否可行取決于你的需求。 如果你的數(shù)據(jù)庫不接受UUID作為主鍵,你可以考慮使用數(shù)據(jù)庫序列。但總是應(yīng)該讓新對象創(chuàng)建的時候被指派一個ID而不是讓Hibernate管理你的ID。在這種情況下,創(chuàng)建新的域?qū)ο蟮纳虡I(yè)對象可以調(diào)用一個使用data Access object(DAO)從數(shù)據(jù)庫序列中獲取數(shù)據(jù)庫id的服務(wù)。如果你使用一個長整型來表示你的對象id,一個單獨的數(shù)據(jù)庫序列(以及服務(wù)方法)對你的域?qū)ο髞碚f已經(jīng)足夠了。
小結(jié)
當(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)域模型中需要的代碼量。
【編輯推薦】
- Hibernate Util簡單討論
- 詳解優(yōu)化Hibernate性能經(jīng)驗
- 概述Hibernate dbcp連接池使用方法
- 淺析Hibernate.cfg.xml配置
- Hibernate Shard基礎(chǔ)分析
文章題目:概述Hibernate對象標(biāo)識符
網(wǎng)頁地址:http://fisionsoft.com.cn/article/djihiid.html


咨詢
建站咨詢
