小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

為MongoDB增加自增長(zhǎng)主鍵生成的功能

 CevenCheng 2011-09-29

為MongoDB增加自增長(zhǎng)主鍵生成的功能

標(biāo)簽: MongoDB 自增長(zhǎng)主鍵
每個(gè)MongoDB的document都有一個(gè)_id字段作為它的第一個(gè)屬性,這個(gè)值通常是一個(gè)BSON對(duì)象id,因此,這個(gè)id對(duì)于集合中的每個(gè)成員都是唯一的,如果用戶插入一個(gè)document沒(méi)有提供一個(gè)id,數(shù)據(jù)庫(kù)將自動(dòng)生成一個(gè)id,并存儲(chǔ)在_id字段。   
   The BSON ObjectId Datatype   
一個(gè)BSON ObjectID是由12個(gè)字節(jié)組成:4字節(jié)時(shí)間+3字節(jié)機(jī)器id+2字節(jié)進(jìn)程id+3字節(jié)的數(shù)字
"_id" : ObjectId("4c691e72ed2a47b462dfa806") }


有時(shí)候我們的應(yīng)用中需要自增長(zhǎng)的數(shù)字型主鍵,MongoDB在這方面并沒(méi)有給我們提供支持,我們需要加以改造,使其具有自增長(zhǎng)主鍵生成的功能。此次的功能改造,依賴的是morphia開(kāi)源項(xiàng)目(MongoDB在java語(yǔ)言上的ORM實(shí)現(xiàn),http://code.google.com/p/morphia/),直接上代碼吧。


首先定義一個(gè)保存各個(gè) collection的主鍵增量值的系統(tǒng)配置collection:StoredSeqence

java 代碼
  1. /**  
  2.  * MongoDB自增長(zhǎng)主鍵維護(hù)隊(duì)列,類似于MSSQL,Oracle維護(hù)主鍵的方式  
  3.  *   
  4.  * @author yongtree  
  5.  * @date 2011-1-17 下午06:58:05  
  6.  * @version 1.0  
  7.  */  
  8. @Entity(noClassnameStored=true)   
  9. public class StoredSeqence implements Serializable {   
  10.   
  11.     private static final long serialVersionUID = 1L;   
  12.   
  13.     @Id  
  14.     String collName;   
  15.   
  16.     Long value;   
  17.        
  18.   
  19.     public StoredSeqence(){   
  20.            
  21.     }   
  22.        
  23.     public StoredSeqence(String collName) {   
  24.         this.collName = collName;   
  25.     }   
  26.   
  27.     public Long getValue() {   
  28.         return value;   
  29.     }   
  30.   
  31.     public void setValue(Long value) {   
  32.         this.value = value;   
  33.     }   
  34.   
  35.     public String getCollName() {   
  36.         return collName;   
  37.     }   
  38.   
  39.     public void setCollName(String collName) {   
  40.         this.collName = collName;   
  41.     }   
  42.   
  43.        
  44.   
  45.        
  46. }   
然后定義一個(gè)實(shí)體的基類,在基類中處理主鍵生成。
java 代碼
  1. /**  
  2.  * 自增長(zhǎng)數(shù)字類型主鍵的Mongo實(shí)體  
  3.  *   
  4.  * @author yongtree  
  5.  * @date 2011-1-17 下午04:11:04  
  6.  * @version 1.0  
  7.  */  
  8. public abstract class LongPKMongoEO extends BaseMongoEO {   
  9.   
  10.     @Id  
  11.     Long _id;   
  12.   
  13.     @Transient  
  14.     protected Datastore ds;   
  15.        
  16.        
  17.   
  18.     public void setDs(Datastore ds) {   
  19.         this.ds = ds;   
  20.     }   
  21.   
  22.     @PrePersist  
  23.     void prePersist() {   
  24.            
  25.         //自增性主鍵的處理   
  26.            
  27.         if (_id == null) {   
  28.             String collName = ds.getCollection(getClass()).getName();   
  29.             Query<StoredSeqence> q = ds.find(StoredSeqence.class"_id",   
  30.                     collName);   
  31.             StoredSeqence ss = q.get();   
  32.             if(ss==null){//不存在該實(shí)體的注冊(cè),則新創(chuàng)建一個(gè)   
  33.                 ss = new StoredSeqence(collName);   
  34.                 ss.setValue(1l);   
  35.             }else{   
  36.                 ss.setValue(ss.getValue()+1);   
  37.             }   
  38.             ds.save(ss);   
  39.             _id=ss.value;   
  40.         }   
  41.     }   
  42.   
  43.     public Long getId() {   
  44.         return _id;   
  45.     }   
  46.   
  47. }  


這樣自增長(zhǎng)主鍵的生成的主要功能基本上已經(jīng)完成了,具體如何使用,接下來(lái)將根據(jù)實(shí)際的項(xiàng)目再做介紹,請(qǐng)繼續(xù)關(guān)注我的博客。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多