落とし穴キター!
public final String delete_DELETEFLAG = "tstamp,timestamp,null";
なんて書いてどうやってupdate時にnullってアノテーションを取ってくるんだ?と思ったら、DELETEFLAGってサフィックスがつかない単体のアノテーションだったのね!!!どおりでおかしいと思ったんだ(笑)
となるとひとつのDaoの中に物理削除と論理削除のメソッドは混ぜる事ができないって事ですね。まぁ、そんなもんインターフェースを分けるだけだから手間にはならないけど。とりあえず削除機能と更新機能は検証完了。動いてます。すごい汚いコード(笑)アノテーションで指定されたプロパティの型が日付だったらアノテーションで定義されている「削除フラグON」の値は無視されて現在の時刻が埋め込まれます。nullも特殊で'null'じゃなくて、nullが入ります。アノテーションは複数定義できるようにしときます。たぶんフラグと日付を同時に更新っていうのが結構あると思うから。
そもそも需要が…って話は大丈夫。使いたいんだけど無いから作るんですっ。最初は言われたからだったけど、作ってみると意外と便利だったり(笑)
#追記:日付型だったら「フラグON値」を無視しちゃ駄目だ。例えば登録日をnullに更新するっていう論理削除の仕方をする場合もあるから。となるとnullって書いてあったらnullでtimestampって書いてあったら現在の時刻かな。っていうか、文字列で指定するから面倒なんだな。
public final String DELETE_FLAG = "tstamp"; public final String DELETE_FLAG_ON = new Date(); public final String DELETE_FLAG_OFF = null;
これじゃ複数定義できないからもっと駄目じゃん!記述量多くてしょぼーんだし。
public final Object[] DELETE_FLAG = { "tstamp", //更新対象の列名 new Date(), //論理削除する時に入れる値 null //普通の更新をする時の値 };
これならいいなぁ〜。DeleteFlagValue.NOUPDATEみたいな定数を入れると、更新時にはデフォルト値で更新してくれるとか。DeleteFlagValue.TIMESTAMPだと現在の時刻を入れてくれるとか。そっちのほうがいいけど、厳密な型チェックがいるしなぁ。Enum使うとTiger必須だし、タイプセーフEnumにしますか。
public final Object[] DELETE_FLAG = { "tstamp", DeleteFlagValue.TIMESTAMP, DeleteFlagValue.NOUPDATE };