2009年5月23日土曜日

GAE/JでJDOの永続化をフックする

表題の事をできる仕組みがGoogle Cookbook - Google App Engineに紹介されていた。Google App Engineのデータストアというより、JDO標準の機能のようだ。Cookbookでは「Created/Updated Timestamps」という内容で説明されている。Entityが永続化されるタイミングで作成日時や更新日時を設定する、といった事ですね。

InstanceLifecycleListener

JDOの仕様にはInstaceLifecycleListenerというリスナがあり、これらのサブクラスにはいくつか種類がある。今回はこの中のStoreLifecycleListenerというリスナを使用する。

準備

まずはStoreLifecycleListenerの実装と、Entityを拡張するためのインターフェースを作成する。

各メソッドの引数で渡されるInstanceLifecycleEventクラスの getPersistentInstance()メソッドで永続化される対象のオブジェクトを取得する事ができるので、Entityを拡張するインターフェースにキャストして、必要なメソッドを実行するカンジ。

拡張対象のEntityを拡張する

上記で言うと、StoreHookAdapterで拡張するかんじ。

使ってみる

ポイントはPersistenceManager#addInstanceLifecycleListener()で、こいつでInstanceLifecycleListenerの実装と、Entityへの拡張を行うインターフェースを関連づける。これは「第2引数で渡した拡張が行われたEntityの永続化のタイミングで、第一引数で渡したInstanceLifecycleListenerの実装を実行する」という意味となるので、拡張が行われていないEntityを永続化した場合にはInstanceLifecycleListenerの実装は走ってくれない(通知されない)。なんかツマランなぁ、と思って pm.addInstanceLifecycleListener(new StoreHookListener(), Object.class); とやってみたら、全てのEntityに対してフックが適用できたw はい、文句ありません。

コメントを投稿