Morphia - 如何在上一版本中替换LongIdEntity.StoredId?

时间:2015-06-17 13:49:44

标签: java mongodb morphia

我刚刚切换到Morphia的最后一个版本(1.0.1)。前一个是com.github.jmkgreen.morphia 1.2.3。

我不知道如何替换LongIdEntity.StoredId。我用它来增加long id

编辑:以下是它的工作原理:

public Key<Snapshot> save(PTSnapshot entity) {
    if (entity.getId() == null) {
        String collName = ds.getCollection(getClass()).getName();
        Query<StoredId> q = ds.find(StoredId.class, "_id", collName);
        UpdateOperations<StoredId> uOps = ds.createUpdateOperations(StoredId.class).inc("value");
        StoredId newId = ds.findAndModify(q, uOps);
        if (newId == null) {
            newId = new StoredId(collName);
            ds.save(newId);
        }
        entity.setId(newId.getValue());
    }
    return super.save(entity);
}

2 个答案:

答案 0 :(得分:0)

StoredId类只是一个包含3个字段的POJO:

  • id
  • className(为了存储自动增量将要完成的对象类型,但你可以存储一些lese,这只是用来检索适当的增量值,因为你可以有多个自动增量值 - 增加收藏!)
  • value(存储自动增量的当前值)

但它只是一个帮手,你可以自己重现这些行为。 基本上你只需要一个存储一个简单数字的集合,并在每次插入一个新对象时用findAndModify()递增它。

我的想法是Morphia / Mongo决定删除它,因为Mongo数据库不推荐自动增量,ObjectId更强大。

答案 1 :(得分:0)

感谢。 这是答案:

 if (entity.getId() == null) {
    DBCollection ids = getDatastore().getDB().getCollection("ids");
    BasicDBObject findQuery = new BasicDBObject("_id", getClass().getSimpleName());
    DBObject incQuery = new BasicDBObject("$inc", new BasicDBObject("value", 1));
    DBObject result = ids.findAndModify(findQuery, incQuery);
    entity.setId(result == null || !result.containsField("value") ? 1L : (Long) result.get("value"));
 }