我正在使用JDO和DataNucleus將運行時生成的對象保存到MongoDB中。數據庫對象有自己的唯一標識符,一個字符串,我把它放到Mongo的_id字段中。這工作不錯,我結束了,比如,這個對象:用JDO/DataNucleus和MongoDB從字符串中獲取數據庫對象_id
(in the mongo shell)
> db.CollectionName.find({"_id":"01e293bc-970d-e0b3-aac1-14109fdb7235_ZMUkU234ufY3opYPeov38T4EilNLURIb8ki"}).pretty()
{
"_id" : "01e293bc-970d-e0b3-aac1-14109fdb7235_ZMUkU234ufY3opYPeov38T4EilNLURIb8ki",
...
當我想要得到一個對象回來了蒙戈的我做我認爲應該工作電話:
PersistenceManager pm = pmf.getPersistenceManager();
String keyString = "01e293bc-970d-e0b3-aac1-14109fdb7235_ZMUkU234ufY3opYPeov38T4EilNLURIb8ki";
Object dbObject = pm.getObjectById(keyString);
但是我沒有得到一個dbObject,而是JDO拋出一個JDONotFoundException異常。我想也許我需要指定DB對象的類,這是艱難的,因爲它是運行時生成的,但我添加了一個黑客,當我堅持時可以保存指向類的指針,以便稍後使用它:
this.savedDBclass = obj.getClass();
pm.makePersistent(obj);
...
PersistenceManager pm = pmf.getPersistenceManager();
String keyString = "01e293bc-970d-e0b3-aac1-14109fdb7235_ZMUkU234ufY3opYPeov38T4EilNLURIb8ki";
Object dbObject = pm.getObjectById(this.savedDBclass, keyString);
在這種情況下,我得到一個JDOFatalUserException「沒有元數據已註冊的類」。當你看到the documentation時,看起來這個過程應該很簡單:「然後你可以回到你的數據層並按如下方式檢索對象:Object obj = pm.getObjectById(id);」
我想我的問題是,我使用的是String而不是ObjectId,但我無法弄清楚使字符串ID工作的巫術。我在文檔中讀到「DataNucleus擴展是將字符串形式的身份傳遞給上述方法」,但我們並未使用該擴展,據我所知。
Quoth JDO規範:「應用程序標識由您,開發人員管理,在應用程序標識下,對象中一個或多個持久字段的值決定其JDO標識,這些字段稱爲主鍵字段。關鍵字段必須是基元,原始包裝,字符串或日期。「 這是「JDO規格非常清晰」的地方嗎?對我來說,這意味着清楚地表明一個字符串的主鍵字段可以用作身份。 – shadynasty 2013-03-23 20:56:52
儘管我對規範有所誤解,但您的建議仍然值得商榷。我得到了運行時'身份'對象,如你所建議並得到我的對象!謝謝。 – shadynasty 2013-03-23 21:43:56