我正在使用 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 扩展是将身份的字符串形式传递给上述方法”,但据我所知,我们没有使用该扩展。