java-spring-hibernate-mysql サーバーの挿入後イベント リスナーを実装しました。私がやりたいことはこれです - 特定のタイプの新しいオブジェクトが作成されるたびに、一連の統計を作成したいと思います。少しランダムですが、クライアントは最も奇妙なことを望んでいます。将来のコーダーが誤ってこれを丸め込むことを望まないので、挿入後のリスナーがこれを達成すると思いました。
ここに私のアプリコンテキストエントリがあります:
<property name="eventListeners">
<map>
<entry>
<key>
<value>post-insert</value>
</key>
<list>
<bean class="xxx.MyPostInsertEventListener" />
</list>
</entry>
</map>
</property>
これは私のクラスです:
package au.com.reignite.recursionNesting;
import org.hibernate.HibernateException;
import org.hibernate.classic.Session;
import org.hibernate.event.PostInsertEvent;
import org.hibernate.event.PostInsertEventListener;
public class MyPostInsertListener implements PostInsertEventListener {
private static final long serialVersionUID = 2377752551659130306L;
@Override
public void onPostInsert(PostInsertEvent event) {
// this kicks in once a new record has been inserted.
if (event.getEntity() instanceof XXX) {
Session session = null;
try {
session = event.getPersister().getFactory().getCurrentSession();
// this is the code that does the creations etc
} catch (HibernateException he) {
// this catches the situation where the transaction persist fails, and ensures the rollback of the information created in the flat tables
System.out.println("transaction persist error: " + he.getMessage());
session.getTransaction().rollback();
}
}
}
}
しかし、私の問題はこれです.2回キックします。オブジェクトを永続化するために、この saveOrUpdate メソッドを呼び出しています。
protected void saveOrUpdate(final Domain domain) {
final List<Domain> domains = new ArrayList<Domain>();
domains.add(domain);
saveOrUpdateAll(domains);
}
protected void saveOrUpdateAll(final Collection<? extends Domain> domains) {
if (domains != null) {
for (final Domain domain : domains) {
if (domain.getId() != null) {
domain.setModifiedDate(new Date());
} else {
domain.setCreatedDate(new Date());
}
}
getHibernateTemplate().saveOrUpdateAll(domains);
}
}
なぜこれが2回呼び出されるのかについてのアイデアはありますか?
時間をありがとう、マーガレット