0

我正在使用 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 “没有为类注册元数据”。

当我查看文档时,似乎此过程应该很简单:“然后您可以返回数据层并按如下方式检索对象:Object obj = pm.getObjectById(id);”

我认为我的问题是我使用的是字符串而不是 ObjectId,但我无法弄清楚使字符串 ID 起作用的巫术。我在文档中读到“DataNucleus 扩展是将身份的字符串形式传递给上述方法”,但据我所知,我们没有使用该扩展。

4

1 回答 1

0

建议您阅读 JDO 规范,该规范非常清楚什么是“身份”(不是字符串),以及什么是 PK 值。您不发布课程本身,因此人们只能猜测。要获得“身份”,您可以轻松做到

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

这就是pm.getObjectById(id). 然后,如果有问题,请查看日志。

于 2013-03-23T16:38:42.097 回答