4

Springを介しPostInsertEventListenerてHibernateに関連付けられているHibernateを実装するクラスがあります。SessionFactoryインターセプターは、post-insertイベントタイプに指定されています。このインターセプターは、を実行するたびに呼び出されますsession.save(entity)。ただし、トランザクションがフラッシュされる前に実行が行われます。データベースが例外をスローした場合、これは問題になります。

質問:が呼び出された後に インターセプターを呼び出すように指定する方法はありますsession.flush()か?

イベントリスナー内で実行しようとしinsertEvent.getSession().flush()ましたが、IDがまだ設定されていないため、主キー違反の例外が発生します。

registerSynchronization基本的な構成が不足しているように思われるため、まだ方法を検討していません。使用されているトランザクションマネージャーはでorg.springframework.orm.hibernate3.HibernateTransactionManagerあり、トランザクション境界は@Transactionalアノテーションによって指定されます。Hibernateバージョンは3.6です

4

3 に答える 3

3

現在の解決策:

セッションをキーとして Post(Insert|Update|Delete) イベントを Map に格納します。セッションの FlushEventListener でマップからイベントを取得し、イベントを処理します。

使用されるマップは、有効期限が分に設定されたGuava キャッシュです。これにより、SQLException が原因で flush() が失敗し、そのセッションのエントリをマップから削除する必要がある場合が捕捉されます。

于 2012-12-06T00:58:39.507 に答える
1

FlushEventListenerを使用するのはどうですか?

于 2012-11-29T22:07:05.593 に答える