[Spring Roo] 06. OpenEntityManagerInViewパターン

2014/02/07 7:49 PM
 

前回まででは、OnlineMemoの編集画面で、関連したAccountを表示しようとした時にエラーになってしまっていた。

Hibernateの遅延ロード機能

これは、Hibernateの遅延ロード機能により、upload.jspxの処理時にAccountオブジェクトにアクセスできないために発生した。Onlinememoの関連先であるAccountは、OnlineMemoをロードした時にはロードせず、Accountにアクセスした時に初めてロードするようになっている。DBからのロードを減らすための工夫であるのだが、こういう面で裏目に出る。

Open Session In Viewパターンによる解決

遅延ロードによるビューの不便さを解決する方法はいくつかある。DBのセッションをビューにまで延ばす方法(Open Session In View)、データ伝達オブジェクト(Transfer Object)を使う方法など。

今回は、もっとも簡単な、Open Session In Viewパターンを使う。データアクセスに関することが、ビューであるJSPにまで関わってしまうのはあまり良くない(JSPで例外が発生しても原因がDBアクセスだとか)が、小規模な開発では、現実的な選択なのではないだろうか。

方法は簡単だ。

WEB-INF/web.xmlに、以下のようなフィルタの設定を追加する。

「OpenSessionInView」と言っておきながら、「OpenEntityManagerInView」という、JPAのEntityManagerの名前なのは、Spring Rooに実行させた、** persistence setup **というコマンドが、JPA persistenceを作るためのものであるから。

上記のように設定すると、前回エラーになってしまった編集画面が、まともに動くようになる。

最初の画面。

014

オンライン・メモの一覧(1件しかないが)。

015

オンライン・メモの編集画面。Accountが選択できるようになっている。

016

以上で、一通りのCRUD処理が動作するようになった。

(Spring MVCの場合、Filterではなくて、Interceptorという機能を使って同様のことができるようなのだが、うまく設定できなかった。)

今回の記事を書くにあたっては、「Spring3 入門」という本の第11章が大いに参考になった。導入には「Spring MVC/Rooプログラミング入門」が適しているが、ちょっと深く知りたくなった時に、手応えのあるホンダと思う。

次回は、コントローラへのメソッドの追加などをしてみる。



コメントはまだありません

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを書く

WordPress Themes