【问题标题】:Get DB object from JDO/DataNucleus and MongoDB with a String _id使用 String _id 从 JDO/DataNucleus 和 MongoDB 获取 DB 对象
【发布时间】:2013-03-23 13:57:32
【问题描述】:

我正在使用 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);”

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

【问题讨论】:

    标签: java mongodb jdo datanucleus


    【解决方案1】:

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

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

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

    【讨论】:

    • Quoth JDO 规范:“应用程序标识由开发人员管理。在应用程序标识下,对象中一个或多个持久字段的值决定了它的 JDO 标识。这些字段称为主键字段. ... 主键字段必须是原语、原语包装器、字符串或日期。”这是“JDO 规范非常明确”的地方吗?对我来说,这显然意味着可以将作为字符串的主键字段用作身份。
    • 尽管我对规范有误解,但您的建议是正确的。按照您的建议,我得到了运行时“身份”对象并得到了我的对象!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 2021-04-15
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多