[jpa:105] Re: HibernateのEventListenerについて

Toshihiro Nakamura [E-MAIL ADDRESS DELETED]
2008年 5月 25日 (日) 16:29:22 JST


中村(taedium)です。

> > 著者です(^^
> 書籍の方、わかりやすく&読みやすくてとても助かっています ^^

ありがとうございます。
そういっていただけるとうれしいです。

> JPA(+Hibernate)アプリケーションで更新履歴のようなものを登録する場合、
> 色々な前提条件があるかとは思いますが、
> 中村さんの設計方針としては次のどれに近いのでしょうか?
> (1)できるだけデータベーストリガーは使わず、HibernateのEventListenerを使う。
> (2)JPAへの影響を考慮しつつ、データベーストリガーを積極的に使う。
> (3)通常のエンティティと同じように更新履歴を登録する(更新前の状態をどこかに保持?)。
> (4)その他

(1)と(2)で迷いますが、強いて言えば(2)でしょうか?

データベーストリガーを使うことの一番の問題は、
永続コンテキスト上の値とデータベース上の値が一致しない
場合が発生することです。
これが発生すると、アプリケーション側で同期をとる
(EntityManagerのrefreshメソッドを呼ぶ)必要があって
アプリケーションが複雑化します。
そのような状況が発生しないのであれば
データベーストリガーは積極的に使っても
いいように思っています。

データベーストリガーは、
複数テーブルにまたがる整合性をチェックしたい場合や
Hibernate以外からのアクセスにも履歴を残したい場合に
使いたくなりますね。

逆に、複数RDBMS対応を考慮する場合や、
Javaで制御したほうが効率的な(スキーマ変更に手間がかかる)場合は
データベーストリガーよりもListenerを使いたくなります。

> > 次のようなメソッドをListenerに用意することで
> > 判断できるようになります。
> 吉田さんに教えていただいて、そっくりなコードを書いたのですが、
> プロパティが見つからなかった時は負数を返すよりも例外をスローする方が
> Java的ですよね ^^;

吉田さんのメールに気づいていませんでした。
思いっきりかぶっちゃいましたね。。。
-- 
Toshihiro Nakamura



jpa メーリングリストの案内