せっかくアクセスログを取れるようになったので、今度は表示することを考える。
今回の目的は、Hibernateを使ってみること。
というわけで、とりあえずセッションを記録しているテーブルをO/Rマッピング開始。
例によってマッピングファイルはXDocletで出力できるよう、「実践Spring FrameworkJ2EE開発を変えるDIコンテナのすべて」と「WEB+DB PRESS Vol.26」の「XDoclet中心生活案内 by きしだっち」を参考に(というかほぼ丸写し)。
とりあえず普通にServletで作ってみようと思ったけど、意外とSpringで普通のServletができないかも。
SpringMVCはやめて、WebApplicationContextUtils経由でBeanを取り出して利用。
Hibernateマッピングして、Daoを作って、(必要ならビジネスロジック作って、)といろんなステップありますなぁ。
今回はデータがリストで取り出せればいいので、Servletから直接Daoを取得することに。
#あくまでも練習用サンプルだし~~。
セッション一覧表示は比較的簡単にできました。
やっぱり(普通のコメントで恐縮ですが、)普通のオブジェクトとしてアクセスできるようになってやりやすいですな。
続いて、アクセス一覧も表示できるようになって、次にそれに紐付く各種データを表示するように修正していく。
ここで、Hibernateの関連機能を使おうと思ったんですが、意外とてこずってしまった。
○1対1対応 → アクセスログ(RequestUriなど)とアクセス情報(RemoteHostなど)を紐付ける
こちらは本に載っている通り設定、構築していくだけでほぼ完了。
○1対多対応 → アクセスログとヘッダ情報を紐付ける
問題はこちら。
一番の問題は、複合キーを使っているところ。
DB設計時に、アクセスIDとヘッダ番号を主キーとしてしまっていたのだ。
#ヘッダ番号を連番にして、アクセスIDを外部キーにして関連付けすべき?
複合キーを使ったときには、Hibernateへの対応のために様々な追加作業が発生するみたい。
また、この設定のときに、<composite-id>という設定をしないといけないんだけど、XDocletはどうやらこの辺には対応していない?みたいなので、ここだけ手書きになってしまった。
まぁ、今後、複合キーを利用せざるを得ない場面も登場するだろうからいい練習になったといえばなったけど。
あと、1対多関連のときに、取得した情報をソートするのが簡単な様で難しかった。
これには、Comparableを実装して、@hibernate.set sort = "natural" (XDoclet)で、getterの返り値の型を SortedSet にすればいいみたいですね。
ともあれ、アクセスログが見れるようになりました。
本番サーバーにアップしてみると、早くも800近くのアクセスが!と思ったけど、そのほとんどがロボット。。。
たま~~に検索エンジン経由で1~2ページ眺めて帰る人がいました。
見れるようになったけど、切ない・・・・。


コメントする