我正在使用JDO和DataNucleus将运行时生成的对象持久化到MongoDB中。数据库对象有自己的唯一标识符,一个字符串,我放入Mongo的_id字段。这工作正常,我最终得到了这个对象:
(in the mongo shell)
> db.CollectionName.find({"_id":"01e293bc-970d-e0b3-aac1-14109fdb7235_ZMUkU234ufY3opYPeov38T4EilNLURIb8ki"}).pretty()
{
"_id" : "01e293bc-970d-e0b3-aac1-14109fdb7235_ZMUkU234ufY3opYPeov38T4EilNLURIb8ki",
...
当我想从Mongo中取出一个对象时,我打电话给我认为应该有效:
PersistenceManager pm = pmf.getPersistenceManager();
String keyString = "01e293bc-970d-e0b3-aac1-14109fdb7235_ZMUkU234ufY3opYPeov38T4EilNLURIb8ki";
Object dbObject = pm.getObjectById(keyString);
但我没有得到dbObject,而是JDO抛出JDONotFoundException。我想也许我需要指定DB对象的类很难,因为它是运行时生成的,但我添加了一个hack,当我持久化时会保存指向该类的指针,以便我以后可以使用它:
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);”< / p>
我认为我的问题是我使用的是String而不是ObjectId,但我无法弄清楚使用String ID工作的巫术。我在文档中读到“DataNucleus扩展是将身份的String形式传递给上面的方法”,但据我所知,我们没有使用该扩展。
答案 0 :(得分:0)
建议你阅读JDO规范,这很清楚什么是“身份”(字符串不是它),什么是PK值。你不会发布课程本身,所以人们不得不猜测。要获得“身份”,您可以轻松做到
Object identity = pm.newObjectIdInstance(MyObject.class, "my_pk_value_when_string");
这就是pm.getObjectById(id)
的内容。然后,如果遇到问题,请查看日志。