研究发现,mongodb完全可以实现自增ID,并且Morphia已经对此做了封装,并且使用起来也非常方便,只需让你的entity继承自LongIdEntity。
下面给出一段entity示例代码如下:
@EntitypublicclassUserextendsLongIdEntity{publicstaticfinalString DBNAME ="myds";publicUser(){super(MongoManager.getDatastore(DBNAME));}privateString username;privateString password;privateint age;//---get set---}
DAO类及测试代码如下:
publicclassUserDAOextendsBasicDAO<user, long="">{publicUserDAO(){super(User.class,MongoManager.getMongo(),MongoManager.getMorphia(),User.DBNAME);}publicstaticvoid main(String[] args){User user =newUser();
user.setPassword("123456");
user.setUsername("lamfire");
user.setAge(100);UserDAO dao =newUserDAO();Keykey= dao.save(user);System.out.println(user.getUsername()+" ID:"+ key.getId());
user =newUser();
user.setPassword("abc123");
user.setUsername("hayash");
user.setAge(99);
key = dao.save(user);System.out.println(user.getUsername()+"ID:"+ key.getId());}}
运行结果输出为:
lamfire ID:1
hayash ID:2
实验证明,这个自增ID已经生效。并且在“myds”库下新增了表"ids",并且表里有一行记录存储了User表对应的自增ID的值,每调用一次该值就被自动加一。
下面,我们再来看看LongIdEntity干了什么事,如何实现的自增呢?里面的核心代码片段如下(关键位置我添加了注释):
String collName = ds.getCollection(getClass()).getName();Queryq= ds.find(StoredId.class,"_id", collName);//跟据表名查询UpdateOperationsuOps= ds.createUpdateOperations(StoredId.class);
uOps.inc("value");//指定了将"value"递增操作StoredId newId = ds.findAndModify(q, uOps);//执行查询并更新,该操作椐有原子性if(newId ==null){
newId =newStoredId(collName);
ds.save(newId);}
myLongId = newId.getValue();