Amazon の ORマッパ Carbonado

JavaのORマッパと言えばhybernateが有名だが,なんか,やたら複雑そうに見えたので,最近出てきたCarbonadoのほうを試してみた.Carbonadoの特徴は,バックエンドのデータベースにいわゆるRelational DBではないBerkely DBが使えること.だから正確にはORマッパではないのかも.にもかかわらず,joinなどのRDB特有の処理もちゃんとできる.不思議.これに関しては,ここに興味深い記事があった.参考になる.
ところで,Carbonadoはカーボネード(黒ダイヤ)のことらしい.どういうニュアンスなんだろう?

ダウンロードとインストール

さて,まずはインストールしてみよう.バックエンドのDBとしては,せっかくなので(?)BarkleyDBを使ってみる.sleepycatというOracle傘下のプロジェクトの二つのBerkley DB実装,BDBとJEが使えるのだが,今回は,Java実装であるJEのほうを使ってみよう.

まずは,Carbonadoのダウンロード.ホームページからJarファイルがダウンロードできる.CarbonadoとCarbonadoSleepyCatJEの双方をダウンロードし,同じ場所で展開する.展開してみると,なかにはMANIFESTとソースツリーがごろんと入っているだけ.build.xmlどころかREADMEやLICENCEも入っていない.いいんだろうか?

これと独立してここから,sleepycatJEをダウンロードして,ビルドしなければならない.ダウンロードするためには,Oracle technology networkに入らなければならない.

さらに,いくつか必要なモジュールがある.

はっきりいってそうとう面倒くさい...

使ってみる

ダウンロードしたパッケージには何もドキュメントが含まれていないが,上記のサイトにドキュメントのPDFがある.

Storable の定義

データベーステーブルに相当するインターフェイスを定義する.ここではクラスではなく,インターフェイスとしているが,アブストラクトクラスでもよいようだ.Beanとして定義する.

@PrimaryKey("ID")
public interface StoredMessage extends Storable{
    long getID();
    void setID(long id);
	
    String getMessage();
    void setMessage(String message);
}

これでIDとMessageを持つテーブルが定義できた.@PrimaryKeyでプロパティ IDがプライマリキーであることを示している.

データの挿入

データオブジェクトを作るには,Carbonadoのレポジトリオブジェクトに対してstorageForメソッドを呼び出して,Storageオブジェクトをつくり,さらにそれに対してprepareメソッドを呼び出す必要がある.storageForメソッドの引数はインターフェイスのクラスオブジェクト.

Storage storage = 
    repo.storageFor(StoredMessage.class);		
StoredMessage message = storage.prepare();
message.setID(1);
message.setMessage("Hello Carbonado!");
message.insert();
データの検索

検索にはQueryオブジェクトを用いる.

Query query= 
    storage.query("ID = ?").with(0);
Cursor cursor = query.fetch();
while (cursor.hasNext())
    System.out.println(cursor.next());

なんというか,ちょっと隔靴掻痒な感が...

@Automatic

@Automatic というプロパティに対するアノテーションがある.これはRDBではautoincrementになるようなのだが,BerkeleyDBでは0が入るだけ.PrimaryKeyには使えない.これは相当不便だ.