我刚刚切换到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);
}
答案 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"));
}