为MongoDB增加自增长主键生成的功能

每个MongoDB的document都有一个_id字段作为它的第一个属性,这个值通常是一个BSON对象id,因此,这个id对于集合中的每个成员都是唯一的,如果用户插入一个document没有提供一个id,数据库将自动生成一个id,并存储在_id字段。
The BSON ObjectId Datatype
一个BSON ObjectID是由 12个字节组成: 4字节时间+ 3字节机器id+ 2字节进程id+ 3字节的数字
{ "_id" : ObjectId( "4c691e72ed2a47b462dfa806") }


有时候我们的应用中需要自增长的数字型主键,MongoDB在这方面并没有给我们提供支持,我们需要加以改造,使其具有自增长主键生成的功能。此次的功能改造,依赖的是morphia开源项目(MongoDB在java语言上的ORM实现,http://code.google.com/p/morphia/),直接上代码吧。


首先定义一个保存各个 collection的主键增量值的系统配置collection:StoredSeqence
/**   
 * MongoDB自增长主键维护队列,类似于MSSQL,Oracle维护主键的方式   
 *    
 * @author yongtree   
 * @date 2011-1-17 下午06:58:05   
 * @version 1.0   
 */   
@Entity(noClassnameStored=true)    
public class StoredSeqence implements Serializable {    
   
    private static final long serialVersionUID = 1L;    
   
    @Id   
    String collName;    
   
    Long value;    
        
   
    public StoredSeqence(){    
            
    }    
        
    public StoredSeqence(String collName) {    
        this.collName = collName;    
    }    
   
    public Long getValue() {    
        return value;    
    }    
   
    public void setValue(Long value) {    
        this.value = value;    
    }    
   
    public String getCollName() {    
        return collName;    
    }    
   
    public void setCollName(String collName) {    
        this.collName = collName;    
    }    
   
        
   
        
}

然后定义一个实体的基类,在基类中处理主键生成。
/**   
 * 自增长数字类型主键的Mongo实体   
 *    
 * @author yongtree   
 * @date 2011-1-17 下午04:11:04   
 * @version 1.0   
 */   
public abstract class LongPKMongoEO extends BaseMongoEO {    
   
    @Id   
    Long _id;    
   
    @Transient   
    protected Datastore ds;    
        
        
   
    public void setDs(Datastore ds) {    
        this.ds = ds;    
    }    
   
    @PrePersist   
    void prePersist() {    
            
        //自增性主键的处理    
            
        if (_id == null) {    
            String collName = ds.getCollection(getClass()).getName();    
            Query<StoredSeqence> q = ds.find(StoredSeqence.class, "_id",    
                    collName);    
            StoredSeqence ss = q.get();    
            if(ss==null){//不存在该实体的注册,则新创建一个    
                ss = new StoredSeqence(collName);    
                ss.setValue(1l);    
            }else{    
                ss.setValue(ss.getValue()+1);    
            }    
            ds.save(ss);    
            _id=ss.value;    
        }    
    }    
   
    public Long getId() {    
        return _id;    
    }    
   
}

转载于:https://my.oschina.net/yongtree/blog/93035

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值