I have a problem that has been using Hibernate 3.6.0 for a very long time (or versions around here). This project has been in development since 2009 and has slowly but surely upgraded Hibernate versions. It’s been using 3.6.x for some time.
I tried upgrading to 3.6.3 to see if it fixed the problem – it didn’t. My tests still run.
I just recently created an implementation for DefaultPreUpdateEventListener. It works great when I unit test it in IntelliJ. It works when I run the tests in Maven. However, when I run my application in Tomcat, I get this stupid classpath error:
Caused by: org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [trainingdividend.dao.UpdatedOnEventListener] for bean with name 'trainingdividend.dao.UpdatedOnEventListener#1342f5b' defined in file [C:\Users\egervari\IdeaProjects\trainingdividend-experiment\target\classes\applicationContext.xml]: problem with class file or dependent class; nested exception is java.lang.NoClassDefFoundError: org/hibernate/event/def/DefaultPreUpdateEventListener
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1253)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:433)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:270)
... 118 more
Caused by: java.lang.NoClassDefFoundError: org/hibernate/event/def/DefaultPreUpdateEventListener
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1026)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1483)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:257)
at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:408)
at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1271)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1242)
... 120 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.event.def.DefaultPreUpdateEventListener
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
... 136 more
This doesn’t really make sense. I have had no problems at all running Hibernate up to this point. None. Why is it that all of a sudden I am getting jar hell problems now for? I mean, this works in the unit/integration tests!
I really hate these kinds of problems. I’d appreciate it if someone could help. I’ve spent 2 hours trying to find out what is up, but I see no problem. My maven dependencies look good – it is only loading 1 version of Hibernate.
At times like this, I wish I was using Rails. I doubt they ever put up with this crap.
Here’s my spring configuration of Hibernate:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="eventListeners">
<map>
<entry key="pre-update">
<bean class="trainingdividend.dao.UpdatedOnEventListener" />
</entry>
</map>
</property>
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>hibernate/coursetemplate.hbm.xml</value>
<value>hibernate/address.hbm.xml</value>
<value>hibernate/user.hbm.xml</value>
<value>hibernate/trainee.hbm.xml</value>
<value>hibernate/company.hbm.xml</value>
<value>hibernate/instructor.hbm.xml</value>
<value>hibernate/module.hbm.xml</value>
<value>hibernate/sysadmin.hbm.xml</value>
</list>
</property>
<property name="namingStrategy">
<bean class="org.hibernate.cfg.ImprovedNamingStrategy"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="javax.persistence.validation.mode">none</prop>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}
</prop>
<prop key="hibernate.generate_statistics">false</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</prop>
</props>
</property>
</bean>
check the jars are included in the class path. try putting jars in tomcat lib.
if u r using custom listeners have u tried adding the event listeners explicitly in the configuration?
or u can implement org.hibernate.event.PreUpdateEventListener