2013-03-23 71 views
0

我正在使用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擴展是將字符串形式的身份傳遞給上述方法」,但我們並未使用該擴展,據我所知。

回答

0

建議您閱讀JDO規範,它非常清楚什麼是「身份」(字符串不是它),什麼是PK值。你不要上課,所以人們只能猜測。爲了得到一個「身份」,你可以很輕鬆地做到

Object identity = pm.newObjectIdInstance(MyObject.class, "my_pk_value_when_string"); 

,這就是進入pm.getObjectById(id)。如果遇到問題,您可以查看日誌。

+0

Quoth JDO規範:「應用程序標識由您,開發人員管理,在應用程序標識下,對象中一個或多個持久字段的值決定其JDO標識,這些字段稱爲主鍵字段。關鍵字段必須是基元,原始包裝,字符串或日期。「 這是「JDO規格非常清晰」的地方嗎?對我來說,這意味着清楚地表明一個字符串的主鍵字段可以用作身份。 – shadynasty 2013-03-23 20:56:52

+0

儘管我對規範有所誤解,但您的建議仍然值得商榷。我得到了運行時'身份'對象,如你所建議並得到我的對象!謝謝。 – shadynasty 2013-03-23 21:43:56

相關問題