Post-Insert イベントリスナーを利用しようとして、Hibernate 3.5.6 を使用しています。イベントの後処理の概念と矛盾しているように見える動作に遭遇しました。オブジェクトを DB にコミットすると、セッションがフラッシュされ、挿入後のイベントがトリガーされます。挿入後イベントがトリガーされた後、いくつかの処理が行われ、最終的にエラーがスローされ、それが元のトランザクションにまでさかのぼります。ここでエラーがキャッチされます。この時点からトランザクションをロールバックできず、DB にエントリがありません。挿入後のイベント リスナーが削除された場合、コードが期待どおりに動作することを確認しました。
元のトランザクションに影響を与えるのは、休止状態の事後イベントの予想される動作ですか? 私の理解では、ポスト イベントは元のトランザクションから完全に独立している必要があります。
以下のコード セグメントとスタック トレースを参照してください。
スタックトレース
at ems.server.domain.IpeManager.getCrcMessage(IpeManager.java:113) ~[bin/:na]
at ems.shared.hibernateEvents.PostInsertListener.onPostInsert(PostInsertListener.java:34) [bin/:na]
at org.hibernate.action.EntityInsertAction.postInsert(EntityInsertAction.java:148) [hibernate3.jar:3.5.6-Final]
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:127) [hibernate3.jar:3.5.6-Final]
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:267) [hibernate3.jar:3.5.6-Final]
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:259) [hibernate3.jar:3.5.6-Final]
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:178) [hibernate3.jar:3.5.6-Final]
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) [hibernate3.jar:3.5.6-Final]
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) [hibernate3.jar:3.5.6-Final]
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206) [hibernate3.jar:3.5.6-Final]
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375) [hibernate3.jar:3.5.6-Final]
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) [hibernate3.jar:3.5.6-Final]
at ems.server.database.dao.Dao.saveOrUpdate(Dao.java:30) [bin/:na]
at ems.server.database.dao.IpeComponentDao.insertComponent(IpeComponentDao.java:29) [bin/:na]
at ems.server.domain.NetworkManager.insertIpeConfig(NetworkManager.java:2876) [bin/:na]
ダオクラス
Session session = HibernateUtil.currentSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.saveOrUpdate(obj);
tx.commit();
return obj;
} catch (ConstraintViolationException e) {
if (tx != null)
tx.rollback();
throw e;
} catch (HibernateException he) {
if (tx != null)
tx.rollback();
throw new HibernateException("Could not save object of class " + obj.getClass().getName(), he);
}
Hibernate.cfg.xml
<event type="post-insert">
<listener class="ems.shared.hibernateEvents.PostInsertListener"/>
</event>
PostInsertListener クラス
package ems.shared.hibernateEvents;
import java.util.*;
import org.hibernate.event.PostInsertEvent;
import org.hibernate.event.PostInsertEventListener;
public class PostInsertListener implements PostInsertEventListener{
private static final long serialVersionUID = 2L;
public void onPostInsert(PostInsertEvent event) {
//DO SOME PROCESSING HERE
}
}