替MongoDB增加自增长主键生成的功能
为MongoDB增加自增长主键生成的功能每个MongoDB的document都有一个_id字段作为它的第一个属性,这个值通常
为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
java?代码
- /** ??*?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; ??
- ????} ????
- ???? ????
- ???? ??} ??
然后定义一个实体的基类,在基类中处理主键生成。
java?代码
- /** ??*?自增长数字类型主键的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; ??
- ????} ????
- }??
这样自增长主键的生成的主要功能基本上已经完成了,具体如何使用,接下来将根据实际的项目再做介绍,请继续关注我的博客。
?
原文:http://www.po-soft.com/hi/yongtree/blog/2157