Hibernate Post Insert事件触发两次

时间:2013-10-23 06:27:06

标签: java hibernate event-listener

我刚刚为我的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);
    }
}

关于为什么可能两次被召唤的任何想法?

谢谢你的时间, 霭

0 个答案:

没有答案