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

Morphia - How to replace LongIdEntity.StoredId in last version?

我刚刚切换到最新版本的 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);
}

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

  • id
  • className(存储自动递增的对象类型,但是你可以存储一些其他的东西,这只是用来检索足够的增量值,因为你可以有超过一个自动递增的集合!)
  • value(存放自增的当前值)

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

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

谢谢。 答案如下:

 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"));
 }