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 オブジェクトのクラスを指定する必要があるかもしれませんが、これは実行時に生成されるため難しいのですが、永続化するときにクラスへのポインターを保存するハックを追加して、後で使用できるようにしました。

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 が発生します。

ドキュメントを見ると、この手順は簡単なように思えます。

私の問題は、ObjectId の代わりに String を使用していることだと思いますが、String ID を機能させるブードゥー教を理解できません。「DataNucleus 拡張機能は、ID の文字列形式を上記のメソッドに渡すことです」というドキュメントを読みましたが、私の知る限り、その拡張機能は使用していません。

4

1 に答える 1

0

「アイデンティティ」(文字列ではありません)とは何か、PK値とは何かが非常に明確なJDO仕様を読むことをお勧めします。クラス自体を投稿しないため、人々は推測に任せられます。「アイデンティティ」を取得するには、簡単に行うことができます

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

そして、それが に入りpm.getObjectById(id)ます。問題がある場合は、ログを確認します。

于 2013-03-23T16:38:42.097 に答える