インスタンス変数を持つ 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)について試したい。
リソース:
- morphia - A type-safe java library for MongoDB - http://code.google.com/p/morphia/
- The Castor Project - http://castor.codehaus.org/