2011-05-29

MongoDB Java Driver 2.6 released

2011-05-27 付けで Java Driver 2.6 がリリースされた。

手元のテスト (Morphia Feasibility Study, part 1-5) では、Morphia 0.99 との組み合わせで問題は起きなかった。

2011-05-20

Eclipse memo - Subversion Native Library Not Avairable

Windows 7 64bit 版を使い始めたので、Eclipse も 64bit 版をインストールして起動したところ、次のようなエラーが発生した。Subclipse プラグインに関係しているようだ。


環境:
  • Eclipse Java EE, 3.6 Helios (Windows 64bit)
  • Java2 SDK, 1.6.0 update25

さて、ダイアログの URL リンクを手繰ると、Windows 64bit 版について以下の情報があった。


この URL リンクは、Subversion のホスティングサイト slik subversion が提供するクライアントソフトウェア slik SVN のダウンロードへ向かう。以下のとおり、64bit 版は別パッケージになっている。


この 64bit 版を早速インストールする。Subversion クライアントには TortoiseSVN を使っているので、ここで必要な JavaHL フィーチャだけをインストールする。



この後 Eclipse を起動すると、問題なく Java プロジェクトを作成し、Team - Update ができた。


リソース:

Windows memo - Ctrl2cap

ノートPCを購入し、遅ればせながら Windows 7 を使い始めた。これまでの XP から一足飛びである。

Ctrl キーと CapsLock キーとを入れ替えることを常としているが、これまでの XP での方法が使えなかった。その方法とは、RemapKey というツールを使うものである。このツールは汎用性が高く、どのキーでも再配置でき、その配置をファイルに書き出し/読み込みできる優れもので、大変重宝していた。

そこで、別な方法を探していて見つけたのが、Ctrl2cap v2.0 である。使い方は至って簡単。アーカイブを展開し、コマンドラインで「ctrl2cap /install」を実行するだけである。ただし、Windows 7 では、コマンドプロンプトを「管理者として実行」で起動しておかねばならない。


リソース:

2011-05-16

Morphia Feasibility Study, part 5 - Spring configuration - TypeConverter supplement

Morphia の DAO を Spring コンテナで生成する場合に、TypeConverter をどう設定するか? 一つの方法を示す。


ドメインオブジェクト
part 3 のときとほぼ同じクラスを使う。ただし、MongoDB のコレクション名は違うものにする。



AccountType については、part 2 に示したものと同様の TypeConverter を使ってその値を小文字で保存する。



TypeConverter の設定方法
さて、part 2 で示したように、Morphia.getMapper().getConverters() で取得した DefaultConverters オブジェクトに対して addConverter( TypeConverter ) メソッドを呼ばなければならない。しかし、DefaultConverters はセッターインジェクションもコンストラクタインジェクションもできない。

そこで、Morphia インスタンスを生成するファクトリクラスを作る。そのファクトリメソッドに TypeConverter を渡し、生成した Morphia インスタンスに addConverter して返す。


Spring の XML による設定は以下のとおり。

morphia2 はファクトリ Morphiafactory の2番目の create メソッドで生成される。さらに、morphia2 がファクトリとなって Datastore インスタンスを生成する。

AccountDAO と PersonDAO はパッケージ名以外 part 3 と同じ。


アプリケーションコード
DAO オブジェクトを生成し、エンティティを操作するコードは以下のとおり。上の XML がクラスパス上の app-context-2.xml ファイルに保存されているとする。

2011-05-06

Morphia Feasibility Study, part 4 - composite pattern

MongoDB と Morphia を試すのはなぜか? それは、コンポジットオブジェクトを「自然に」永続化・検索したいからである。

これまで、RDB と Object-Relational (O/R) マッピングフレームワークを使ってきた。具体的には、Object-XML マッピングも扱える Castor を利用してきた。しかし、コンポジットオブジェクトの扱いに苦労した。


コンポジットパターンとは?
Wikipedia (|)を参照されたし。要するに、自己参照ループを持つようなクラス構造で、インスタンスはツリーを成す。

以下に、Wikipedia 日本語版の例を少し変更したコンポジットパターンのクラスを示す。一部のメソッドは省略した。

さて、このようなコンポジットパターンのオブジェクトを RDB に保存するにはどうすればよいか? 簡単ではない。以下のような課題に直面する。
  • 階層構造を読み出すには、ツリーをたどりながら複数回の検索を行うか、1回の検索で関連するオブジェクトをすべて取得してアプリケーション側で階層を構成するか。保存する場合は逆の手順が必要。
  • Composite 役と Leaf 役を一つのテーブルに格納しようとすると、各クラスに固有のプロパティはそれ以外のクラスのインスタンスのカラムで NULL になってしまう。
  • Composite 役と Leaf 役をそれぞれ独自のテーブルに保存するには、O/Rマッピングフレームワークが多態性をサポートしていなければならない(part 1 参照)。Component 役が抽象クラスで継承関係をもマッピングしようとするならば、データベースレコード継承(関係継承)が必要。
MongoDB や CouchDB などのいわゆるドキュメント指向 DB は、このような階層型データ構造や多態性(part 1 参照)を自然に扱えるのである。


テストコード
上に示したコンポジットパターンを Morphia を使って MongoDB に出し入れしてみる。

コンポジットオブジェクトを保持するクラスを用意する。


テストコードは以下のとおり。



保存されたドキュメント
上のコードで保存されたドキュメントの JSON 表現を見てみる。

Folder 型のオブジェクトが入れ子状になってツリー構造を成しているのがわかる。オブジェクトの読み出しも問題なく行えた。


リソース: