MongoDBとmorphia

mungbeanはPOJOに何も手を加えなくても保存できそうで良かったのですが、残念ながら現状では複数のPOJOを一度に扱うことができないようです。"Third Party Frameworks and Libs"に戻って、mungbeanと同じくPOJO Mappersカテゴリであるmorphiaというライブラリを試してみました。
morphiaの場合、POJOをMongoDBに保存する為にannotation等を追加する必要があります。*1 persistenceの起点となるFooに対して、@Entityと@Id、そしてObjectIdプロパティを追加しました。

何とかannotationの追加だけでいけないか試してみましたが、Morphia#mapメソッドをcallする際に例外が出ました…。仕方なく、FooにObjectIdを追加しています。
Barは@Embeddedを追加しています。こちらはObjectIdは必要なしです。

実際にFooを保存するコードは以下となります。今回はBarのリストも設定しています。

実行後に確認してみたところ、Listも含めてFooが保存されていました。

> db.Foo.find();
{ "_id" : ObjectId("4dc2b9069f14c071cf549dc9"), "className" : "test.entity.Foo",
 "id" : 1, "name" : "hoge", "created" : ISODate("2011-05-05T14:49:42.270Z"), "bars" : [
        {
                "id" : NumberLong(2),
                "list" : [
                        "foo",
                        "bar",
                        "hoge"
                ]
        },
        {
                "id" : NumberLong(3),
                "list" : [
                        "mungbean",
                        "test"
                ]
        }
] }

morphiaのトップページを見ると分かりますが、このmorphiaはannotationによって保存するプロパティ等を調整したり、ロード後の振る舞いを指定したり、色々とできるようです。MongoDBをメインのストレージとするならば、現状はmorphiaの方が良いでしょう。ただ、今回は個人的にMongoDBをサブのストレージとして使う方法を探していたので、mungbeanのアプローチにちょっと手を加えることになるかな…。

*1:それが嫌だったので、mungbeanの方を最初に試しました。