表題の事をできる仕組みが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 はい、文句ありません。
0 件のコメント:
コメントを投稿