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
> 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の方を最初に試しました。