使用String _id从JDO / DataNucleus和MongoDB获取DB对象

时间:2013-03-23 13:57:33

标签: java mongodb jdo datanucleus

我正在使用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形式传递给上面的方法”,但据我所知,我们没有使用该扩展。

1 个答案:

答案 0 :(得分:0)

建议你阅读JDO规范,这很清楚什么是“身份”(字符串不是它),什么是PK值。你不会发布课程本身,所以人们不得不猜测。要获得“身份”,您可以轻松做到

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

这就是pm.getObjectById(id)的内容。然后,如果遇到问题,请查看日志。