Gson處理mongoDB的ObjectId的問題

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章