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 の文字列形式を上記のメソッドに渡すことです」というドキュメントを読みましたが、私の知る限り、その拡張機能は使用していません。