Java處理mongoDB數據庫時,很多人會用到Gson來將實體類與json之間轉換,確實方便了不少。
如果你的實體類中用到ObjectId(org.bson.types.ObjectId)時,可要小心了,可能會引發一些小麻煩。
比如有實體類 User
public class User {
private ObjectId _id;
private String name="";
private int age=0;
public ObjectId get_id() {
return _id;
}
public void set_id(ObjectId _id) {
this._id = _id;
}
public String getName() {
return name;
}
public void setName(string name) {
this.name=name
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
}
age+1 操作
public User incAge(String qname){
BasicDBObject qreobj= (BasicDBObject) standbyCollection.findOne(new BasicDBObject("name",qname));
//讀取記錄
User user=gson.fromJson(qreobj.toString(), User.class);
//age+1
user.setAge(user.getAge()+1);
user.set_id(null);//要去掉,避免主鍵重複
//寫回數據庫
BasicDBObject queryObject2=new BasicDBObject("_id",user.get_id());
BasicDBObject updateObj=(BasicDBObject)JSON.parse(gson.toJson(user, User.class));
standbyCollection.update(queryObject2, updateObj, false, false);
return user;
}
看起來應該沒問題了,可是實際上standbyCollection.update卻不起作用。因爲Gson在fromJson的操作裏,沒有忠實地把數據庫中的ObjectId賦值到User類裏,而是新生成了一個ObjectId,所以queryObject2裏的_id與數據庫中的_id匹配不上。
那應該怎麼做呢?
改成如下即可:
public User incAge(String qname){
BasicDBObject qreobj= (BasicDBObject) standbyCollection.findOne(new BasicDBObject("name",qname));
//讀取記錄
User user=gson.fromJson(qreobj.toString(), User.class);
//注意這句
user.set_id(qreobj.getObjectId("_id")); //Gson靠不住,ObjectId沒有照樣set進去,需要人工再set一次
//age+1
user.setAge(user.getAge()+1);
user.set_id(null);//要去掉,避免主鍵重複
//寫回數據庫
BasicDBObject queryObject2=new BasicDBObject("_id",user.get_id());
BasicDBObject updateObj=(BasicDBObject)JSON.parse(gson.toJson(user, User.class));
standbyCollection.update(queryObject2, updateObj, false, false);
return user;
}
也就是說,最好在fromJson後,再人工set一次ObjectId。