2011-04-21

Morphia Feasibility Study, part 2 - enum

part 1 で示した2番目の要求、「インスタンス変数を持つ enum を扱えること」を試す。

インスタンス変数を持つ enum とは?
ここでの目的は、Java の識別子ではない定数のリストを定義することである。以下の Enum 型 ComplexEnum は一つの例である。AT_LEAST_ONE 定数の「値」"at least one" は、空白を含むので、enum 定数として直接宣言できない。ONLY_ONE も同様。



これまで、Java オブジェクトの永続化に RDB を利用し、O/Rマッピングに Castor を利用してきた。Castor は多態性をサポートし、上記のような enum 型も「ある約束」に従えば問題なく SQL CHAR/VARCHAR にマップしてくれる。ある約束とは、上記の fromValue と value メソッドである。

さて、MongoDB ではどうか?


単純な enum 型
まず、以下の単純な enum 型 SimpleEnum を試す。コンテナクラス SimpleEnumContainer を MongoDB のコレクション "enum" に対応付ける。



Morphia を使って、MongoDB への保存と読み出すコードは以下のとおり。特に何もせずに、単純型の値と同じように保存できる。



MongoDB に保存されたドキュメントは以下のとおり。




インスタンス変数を持つ enum 型
いよいよ本題。最初に示した ComplexEnum 型を試す。コンテナクラスは以下のとおり。



Java オブジェクトと MongoDB ドキュメントとの間で特別なマッピングを行うには、TypeConverter を使う。ComplexEnum に対して、以下のように encode/decode メソッドを定義する。


update (2011-04-26): implements SimpleValueConverter を追加。


この ComplexEnumConverter を使ったオブジェクトの保存/読み出しのコードを以下に示す。



MongoDB に保存されたドキュメントは以下のとおり。



これで Morphia が所期の要件を満たすことがわかった。

次は、オブジェクト間の関連(1:n や m:n)について試したい。


リソース: