0

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回呼び出されるのかについてのアイデアはありますか?

時間をありがとう、マーガレット

4

0 に答える 0