我刚刚为我的 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);
}
}
关于为什么这可能会被调用两次的任何想法?
谢谢你的时间,玛格丽特