Further to a discussion in the Hibernate Users folder (
http://forum.hibernate.org/viewtopic.php?t=954382 ), I've been advised to post the question here.
I'm using EJB3/hibernate in JBoss. I have the following line in persistence.xml:
Code:
<property name="hibernate.ejb.cfgfile" value="hibernate_config.xml"/>
In hibernate_config.xml, I set up event handlers:
Code:
<event type="pre-update">
<listener class="com.fcl.util.HibernateEventListener"/>
</event>
<event type="post-commit-update">
<listener class="com.fcl.util.HibernateEventListener"/>
<listener class="org.hibernate.lucene.event.LuceneEventListener"/>
</event>
<event type="post-commit-insert">
<listener class="com.fcl.util.HibernateEventListener"/>
<listener class="org.hibernate.lucene.event.LuceneEventListener"/>
</event>
<event type="post-commit-delete">
<listener class="com.fcl.util.HibernateEventListener"/>
<listener class="org.hibernate.lucene.event.LuceneEventListener"/>
</event>
(I'm using Lucene to add searchability)
My own code is in com.fcl.util.HibernateEventListener.
The 3 post-whatever events are being fired, and I can see my Lucene indices.
My event listener, the com.fcl.util.HibernateEventListener is not called.
After some investigation, I put debug statements to display a stack trace into
Code:
org.hibernate.event.EventListeners.setPreUpdateEventListeners(PreUpdateEventListener[] preUpdateEventListener)
From this, I discovered that the configuration setup on app deployment is configuring the SessionFactory twice.
Code:
16:54:16,015 INFO [Configuration] configuring from resource: hibernate_config.xml
16:54:16,015 INFO [Configuration] Configuration resource: hibernate_config.xml
16:54:16,031 INFO [STDOUT] java.lang.Exception: Setting PreUpdateEventListeners
16:54:16,031 INFO [STDOUT] at org.hibernate.event.EventListeners.setPreUpdateEventListeners(EventListeners.java:418)
16:54:16,031 INFO [STDOUT] at org.hibernate.cfg.Configuration.setListeners(Configuration.java:1661)
16:54:16,031 INFO [STDOUT] at org.hibernate.cfg.Configuration.setListeners(Configuration.java:1493)
16:54:16,031 INFO [STDOUT] at org.hibernate.cfg.Configuration.parseEvent(Configuration.java:1469)
16:54:16,031 INFO [STDOUT] at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1401)
16:54:16,031 INFO [STDOUT] at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1363)
16:54:16,031 INFO [STDOUT] at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1339)
16:54:16,031 INFO [STDOUT] at org.hibernate.cfg.Configuration.configure(Configuration.java:1259)
16:54:16,031 INFO [STDOUT] at org.hibernate.ejb.Ejb3Configuration.createEntityManagerFactory(Ejb3Configuration.java:378)
16:54:16,031 INFO [STDOUT] at org.hibernate.ejb.Ejb3Configuration.createContainerEntityManagerFactory(Ejb3Configuration.java:20
2)
16:54:16,062 INFO [STDOUT] at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.j
ava:78)
16:54:16,062 INFO [STDOUT] at org.jboss.ejb3.Ejb3Deployment.initializeManagedEntityManagerFactory(Ejb3Deployment.java:512)
16:54:16,062 INFO [STDOUT] at org.jboss.ejb3.Ejb3Deployment.create(Ejb3Deployment.java:253)
16:54:16,062 INFO [STDOUT] at org.jboss.ejb3.Ejb3JmxDeployment.create(Ejb3JmxDeployment.java:230)
16:54:16,062 INFO [STDOUT] at org.jboss.ejb3.Ejb3Module.createService(Ejb3Module.java:34)
and then, a few milliseconds later:
Code:
16:54:16,171 INFO [STDOUT] java.lang.Exception: Setting PreUpdateEventListeners
16:54:16,171 INFO [STDOUT] at org.hibernate.event.EventListeners.setPreUpdateEventListeners(EventListeners.java:418)
16:54:16,171 INFO [STDOUT] at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:124)
16:54:16,171 INFO [STDOUT] at org.hibernate.ejb.Ejb3Configuration.createEntityManagerFactory(Ejb3Configuration.java:473)
16:54:16,171 INFO [STDOUT] at org.hibernate.ejb.Ejb3Configuration.createContainerEntityManagerFactory(Ejb3Configuration.java:20
2)
16:54:16,171 INFO [STDOUT] at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.j
ava:78)
16:54:16,171 INFO [STDOUT] at org.jboss.ejb3.Ejb3Deployment.initializeManagedEntityManagerFactory(Ejb3Deployment.java:512)
16:54:16,171 INFO [STDOUT] at org.jboss.ejb3.Ejb3Deployment.create(Ejb3Deployment.java:253)
16:54:16,171 INFO [STDOUT] at org.jboss.ejb3.Ejb3JmxDeployment.create(Ejb3JmxDeployment.java:230)
16:54:16,171 INFO [STDOUT] at org.jboss.ejb3.Ejb3Module.createService(Ejb3Module.java:34)
16:54:16,171 INFO [STDOUT] at org.jboss.system.ServiceMBeanSupport.jbossInternalCreate(ServiceMBeanSupport.java:245)
16:54:16,171 INFO [STDOUT] at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:228)
16:54:16,171 INFO [STDOUT] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
16:54:16,171 INFO [STDOUT] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
16:54:16,171 INFO [STDOUT] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
16:54:16,171 INFO [STDOUT] at java.lang.reflect.Method.invoke(Method.java:585)
16:54:16,171 INFO [STDOUT] at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:141)
16:54:16,171 INFO [STDOUT] at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80)
16:54:16,171 INFO [STDOUT] at org.jboss.mx.server.Invocation.invoke(Invocation.java:72)
16:54:16,171 INFO [STDOUT] at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:245)
16:54:16,171 INFO [STDOUT] at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:644)
16:54:16,171 INFO [STDOUT] at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:943)
It's configuring once from my XML configuration file, and then it does its own configuration where it sets the pre update listener to be a org.hibernate.validator.event.ValidateEventListener
The problem is that the org.hibernate.event.EventListeners class only has a method for
setting the entire stack of listeners. OK, you can get the array, create a new one, copy the old one, add yours, and set it, but the org.hibernate.ejb.EventListenerConfigurator doesn't do that, it just uses what's available and stomps over user-specified listeners.
Surely, like most event handling patterns there should be an addBlahEventListener() call in org.hibernate.event.EventListeners?
Either that or org.hibernate.ejb.EventListenerConfigurator should get the handler array, copy it to a new array, and
add it's own listener at the start or end of the array.