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();
        }
    }

}

}

但我的问题是:它启动了两次。我正在调用这个 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);
    }
}

关于为什么这可能会被调用两次的任何想法?

谢谢你的时间,玛格丽特

4

0 回答 0