2009-10-09 5 views
8

私はHibernateが自分の削除を行った後にテーブル内のIDを更新する機能を実装します。しかし、どのアプローチがより良いかについてのフィードバックを得たいと思います。また、テーブルの値を更新しているので、Hibernateはそれについて知らないので、まっすぐなjdbcの更新を行う必要があります - それも可能です。Hibernate:イベントリスナまたはインターセプタ、実際にはどのような長所と短所がありますか?

答えて

8

リスナ/インターセプタを使用する限り、私はリスナと一緒に行くことができます。リッスンできるイベントに関しては柔軟性があります。インターセプタの主な目的は、ある種のイベント(削除など)に対して、オブジェクトのプロパティより前に検査/変更することです()。リスナーは「PostDelete」イベントまたはmany othersを聞くように設定できます。

しかし、上記のテーブルがマップされていない場合、どちらかが必要ですか? delete()を呼び出した後(または、外部キーが関わっている場合はflush()を呼び出した後)、コード内で直接更新することができます。

トリガーでも行うことができます(おそらく、必要な情報がデータベースで利用可能かどうかによって異なります)。

+0

よくhibernateがビューを見るので、私はwhere句で渡せないdeleteのセッションIDを渡す必要があります。ですから、hibernateがビューの削除を "代わりに"トリガを実行するときに実行しますが、この実行後、ビューの基本テーブルに監査の形式として削除を行った人のセッションIDを渡す方法が必要になります。しかし、このベーステーブルの休止状態は何も分かっていないので、@PostDeleteでは、orm-ed以外のテーブルに対して挿入/更新を実行できますか? –

+0

私はそれを試してみます –

+0

@PostDeleteEvent(リスナーに渡されます)は、getSession()を持つAbstractEvent(https://www.hibernate.org/hib_docs/v3/api/org/hibernate/event/AbstractEvent.html)から継承しています。 () 方法。ですから、 'createSQLQuery()'を使うか、名前付きクエリとしてSQLを定義し、 'getNamedQuery()'を使って、必要なパラメータを設定して実行することができます。私は特にPostDeleteListenerでこれを試していませんが、なぜ動作しないのか分かりません。 – ChssPly76

1

私が知っているように、インターセプタは休止状態のチームの古い実装であり、リスナーは新しいインターセプタの柔軟なバージョンです。 Imhoは、インターセプタとして、休止状態のリスナを使いやすくしました。

2

多くの人がイベントの幅広いリストを提供し、より柔軟性がありますが、インターセプタが提供するものとリスナーが持たないものがあります。

たとえば、エンティティをデータベースに保存する前に変更する場合は、インターセプタを使用する必要があります。

関連する問題