2015-02-04 45 views
1

我使用嗎啡0.109和定義一個基類如下:當我保存ItemTest到MongoDB的實例嗎啡@Version不工作

@Entity 
public abstract class MorphiaData { 
    @Id protected ObjectId objectId; 
    @Version private Long mongodocversion; 
} 

和預期嗎啡實體

public class ItemTest extends MorphiaData { 
    public Long testValue; 
} 

該文件如下:

{ 
    "_id" : ObjectId("54d26ed66aca89c0717e8936"), 
    "className" : "test.ItemTest", 
    "testValue" : NumberLong(1423077078) 
} 

我期待看到值爲mon godocversion在文檔中。

的嗎啡文檔提供關於版本註釋以下信息:

此字段將自動爲您管理 - 沒有必要 設置一個值,你不應該這樣做呢。

@Entity 
class MyClass { 
    ... 
    @Version Long v; 
} 

,我相信我也堅持。我嘗試了以下修復但未成功:

  1. 在子類中移動版本註釋。
  2. 刪除version參數的'private'聲明。

任何意見將不勝感激。

編輯補充:在我使用的保存過程:

DBObject document = MongoDbFactory.getMorphia().toDBObject(this); 

DB db = MongoDbFactory.getClient(); 
DBCollection coll = db.getCollection(noSqlCollection.toString()); 

if (this.objectId != null) { 
    //This is an update 
    BasicDBObject searchQuery = new BasicDBObject().append("_id", this.objectId); 
    coll.update(searchQuery, document); 
} else { 
    //This is just an add 
    coll.insert(document); 
    this.objectId = (ObjectId)document.get("_id"); 
} 

回答

1
+0

謝謝你的參考,我會進一步調查並寄回。 – MarcF

+0

我已經通過了測試用例並發現了一些差異,特別是您正在使用dataStore,而我正在使用集合進行保存。我已經更新了我的問題以包含我的保存程序。你能告訴我這是不同的地方嗎? – MarcF

+0

你完全繞過了morphia的保存機制。你如何認爲嗎啡在這種情況下可以應用其邏輯? *爲什麼*你是這樣做的? 'datastore.save()'應該做你想做的事。 – evanchooly