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